Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.06.15;
Скачать: [xml.tar.bz2];

Вниз

Оператор цикла For - порядок выполнения   Найти похожие ветки 

 
Чайник ©   (2008-05-19 23:29) [0]

В операторе цикла типа

 For i:=1 To High(AGroup) do

компилятор упорно оптимизитрует код и переменная i начинается с максимкма и уменьшается до 1. Как заставить компилятор, чтобы цикл выполнялся именно так, как написан - т.е.  начинался с 1 и увеличивался вверх?

P.S. Попытка отключить оптимизацию  {$O-} не помогает


 
DrPass ©   (2008-05-19 23:34) [1]


> P.S. Попытка отключить оптимизацию  {$O-} не помогает

Помогает, смотря только куда ее засунуть


> Как заставить компилятор, чтобы цикл выполнялся именно так,
>  как написан - т.е.  начинался с 1 и увеличивался вверх?
>

Ээээ, а зачем, если не секрет? Эта оптимизация ускоряет работу цикла, и ни в каком случае не может повлиять на результат работы этого цикла. Зачем же ее отключать?


 
Anatoly Podgoretsky ©   (2008-05-19 23:35) [2]

> Чайник  (19.05.2008 23:29:00)  [0]

Зачем?
Психологические проблемы?


 
Чайник ©   (2008-05-19 23:41) [3]


> Anatoly Podgoretsky ©   (19.05.08 23:35) [2]
> > Чайник  (19.05.2008 23:29:00)  [0]
>
> Зачем?
> Психологические проблемы?


Заполняю TreeView из массива. Правильная последовательность узлов - "психологическая проблема"


> DrPass ©   (19.05.08 23:34) [1]
>
> > P.S. Попытка отключить оптимизацию  {$O-} не помогает
>
> Помогает, смотря только куда ее засунуть


А куда?
Поставил перед циклом и после - опять включить:

 {$O-}
 For i:=1 To High(AGroup) do
 begin
   Obj := AGroup[i].Groupe; Obj := (Obj Shl 8);
   Obj := Obj + AGroup[i].SubGroup;
   IF AGroup[i].SubGroup = 0 Then GroupNode := GroupTreeView.Items.AddObject(nil, AGroup[i].Title, POinter(Obj))
 end;
 {$O+}


 
DrPass ©   (2008-05-19 23:52) [4]


> Заполняю TreeView из массива. Правильная последовательность
> узлов - "психологическая проблема"

Ясно. А теперь проверь внимательнее свою программу. Потому что когда ты используешь счетчик цикла как индекс массива, компилятор это видит, и автоматически восстанавливает прямой порядок счетчика. Ты что, всерьез думаешь, что в оптимизаторе могут быть такие глупые баги? У тебя ошибка в другом месте.


> А куда?
> Поставил перед циклом и после - опять включить:

Перед началом процедуры и после нее


 
Чайник ©   (2008-05-19 23:55) [5]


> А теперь проверь внимательнее свою программу. Потому что
> когда ты используешь счетчик цикла как индекс массива, компилятор
> это видит, и автоматически восстанавливает прямой порядок
> счетчика. Ты что, всерьез думаешь, что в оптимизаторе могут
> быть такие глупые баги? У тебя ошибка в другом месте.


Посмотрел три раза и ничего не увидел. Самое интересное, пока ждал ответов на вопрос - изменил цикл на repeat - until - все заработало как хотел.


 
Чайник ©   (2008-05-19 23:57) [6]


> Перед началом процедуры и после нее


Это что же, на всю процедуру отключиться оптизизация? Это не есть хорошо... А кусочек кода никак?


 
DrPass ©   (2008-05-20 00:26) [7]


> Посмотрел три раза и ничего не увидел

Значит, плохо смотрел. Повторю еще раз (как матру, для лучшего усваивания :) - такой ошибки, как ты говоришь, быть не может. Никакие действия оптимизатора над циклом for не повлияют на результат работы программы, он все учитывает.

> Это что же, на всю процедуру отключиться оптизизация?

Да

> Это не есть хорошо...

А не надо отключать

> А кусочек кода никак?

Нет. Оптимизатор учитывает в своей работе не кусочки кода, а процедуры целиком.


 
{RASkov} ©   (2008-05-20 00:30) [8]

> А кусочек кода никак?

Вынести этот кусочек в отдельную процедуру....


 
Amoeba ©   (2008-05-20 00:33) [9]


> Чайник ©   (19.05.08 23:29)

Не страдай фигней!


 
Германн ©   (2008-05-20 00:40) [10]


> Чайник ©   (19.05.08 23:29)
>
> В операторе цикла типа
>
>  For i:=1 To High(AGroup) do
>


> Посмотрел три раза и ничего не увидел.

Приведи реальный код цикла. Ткнём носом в то, что ты не увидел.


 
Мастер   (2008-05-20 11:49) [11]

Удалено модератором


 
Мастер   (2008-05-20 11:51) [12]


> Чайник ©   (19.05.08 23:29)


Если компилятор увидит, что в цикле тебе необходим прямой порядок обработки, то он не будет менять границы цикла.


 
Nucer   (2008-05-20 12:28) [13]

Недавно тоже столкнулся с такой проблемой. Код:

for i:=0 to high(raw.dt) do
   begin
    res.dt[i]:=dta1[i]*((raw.dt[i]-raw.u1)/(raw.u3-raw.dt[i]))-dtb1[i];
    messagebox(0,PChar(FloatToStr(res.ktb[i])),"",0);
   end;


Сообщение выводил для отладки (надо было сравнивать получившиеся значения с таблицой). Долго ломал голову почему результат не совпадает с тем, что должно получиться.
Если добавить вывод I, то порядок получается нужным:
messagebox(0,PChar(FloatToStr(res.ktb[i])),PChar(IntToStr(i)),0);


 
Nucer   (2008-05-20 12:30) [14]

Прошу прощения, цикл вот такой:
for i:=0 to high(raw.ktb) do
   begin
    res.ktb[i]:=(raw.ktb[i]-raw.u1)/ktbc[i];
    messagebox(0,PChar(FloatToStr(res.ktb[i])),"",0);
   end;


 
Nucer   (2008-05-20 12:35) [15]

И что самое смешное, если заменить строку в цикле на:
res.ktb[i]:=(res.ktb[i-1]-raw.u1)/ktbc[i];
Т.е. значение элемента элемента с номером I будет зависеть от значения элемента с номером I-1, то ВСЕ РАВНО цикл будет выполняться с high downto 0.


 
ЮЮ ©   (2008-05-20 12:40) [16]

> Т.е. значение элемента элемента с номером I будет зависеть
> от значения элемента с номером I-1, то ВСЕ РАВНО цикл будет
> выполняться с high downto 0.

А тв по выводимому FloatToStr(res.ktb[i])) запросто выясняешь какому i это соответстыует?

> Если добавить вывод I, то порядок получается нужным:

И в том и другом случае порядок будет нужным. Считай, это среда неверно отображает значение переменной цикла.


 
ЮЮ ©   (2008-05-20 12:43) [17]

Для чистоты эксперимента сделай конкатенацию символов строки и убедись, что в результате будет верная строка, несмотря на то, что переменная цикла изхменялась «неверно».


 
Nucer   (2008-05-20 12:44) [18]


> А тв по выводимому FloatToStr(res.ktb[i])) запросто выясняешь
> какому i это соответстыует?

Есть такая вещь как брейкпоинты и кнопки F7/F8. Ты хочешь сказать что там тоже выводятся не реальные значения?


 
ЮЮ ©   (2008-05-20 12:46) [19]

> Есть такая вещь как брейкпоинты и кнопки F7/F8. Ты хочешь
> сказать что там тоже выводятся не реальные значения?


Именно там и выводится неправидьные значения. Поэтому в ходе отдажки я всегда отключаю нафиг оптимизацию. Причем у всего проекта. Причем никогжа и не влючаю её обратно :)


 
Nucer   (2008-05-20 12:51) [20]

Действительно так =)

procedure TfrmMain.FormCreate(Sender: TObject);
var
a:array [0..9] of double;
i:integer;
begin
a[0]:=1;
for i:=1 to high(a) do
 begin
  a[i]:=a[i-1]+1;
 end;
end;


I бегут с 9 до 1, при этом массив заполняется с 2го элемента до 9го.
А я вчера час точно убил на эксперименты =)


 
Anatoly Podgoretsky ©   (2008-05-20 15:03) [21]

> Nucer  (20.05.2008 12:51:20)  [20]

Ты отладку провел?



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2008.06.15;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.006 c
15-1210019900
Германн
2008-05-06 00:38
2008.06.15
Что такое JET 4.0


2-1211285342
Павел
2008-05-20 16:09
2008.06.15
Установка RXLib на Дельфи 6


2-1211353058
NieL
2008-05-21 10:57
2008.06.15
API функция


2-1211546124
StiTch
2008-05-23 16:35
2008.06.15
Мемо


15-1209913573
Fredy314
2008-05-04 19:06
2008.06.15
Нужна помощь с JavaScript





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский