Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.06.15;
Скачать: CL | DM;

Вниз

Оператор цикла 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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.018 c
2-1211559464
223001
2008-05-23 20:17
2008.06.15
время


15-1208969171
tesseract
2008-04-23 20:46
2008.06.15
Зарплата программиста.


11-1189762779
Yury Sidorov
2007-09-14 13:39
2008.06.15
Предложение отказаться от ASM версии


15-1209886588
Ega23
2008-05-04 11:36
2008.06.15
Вэкап-файлы (те которые с ~)


11-1188653328
Vladimir Kladov
2007-09-01 17:28
2008.06.15
Версия 2.79