![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Оператор цикла For - порядок выполнения [D7, XP]
Чайник © (2008-05-19 23:29:00)В операторе цикла типа
For i:=1 To High(AGroup) do
компилятор упорно оптимизитрует код и переменная i начинается с максимкма и уменьшается до 1. Как заставить компилятор, чтобы цикл выполнялся именно так, как написан - т.е. начинался с 1 и увеличивался вверх?
P.S. Попытка отключить оптимизацию {$O-} не помогает
Anatoly Podgoretsky (2008-05-20 15:03:00) [1]> Nucer (20.05.2008 12:51:20) [20]
Ты отладку провел?
Nucer (2008-05-20 12:51:00) [2]Действительно так =)
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го.
А я вчера час точно убил на эксперименты =)
ЮЮ (2008-05-20 12:46:00) [3]> Есть такая вещь как брейкпоинты и кнопки F7/F8. Ты хочешь
> сказать что там тоже выводятся не реальные значения?
Именно там и выводится неправидьные значения. Поэтому в ходе отдажки я всегда отключаю нафиг оптимизацию. Причем у всего проекта. Причем никогжа и не влючаю её обратно :)
Nucer (2008-05-20 12:44:00) [4]
> А тв по выводимому FloatToStr(res.ktb[i])) запросто выясняешь
> какому i это соответстыует?
Есть такая вещь как брейкпоинты и кнопки F7/F8. Ты хочешь сказать что там тоже выводятся не реальные значения?
ЮЮ (2008-05-20 12:43:00) [5]Для чистоты эксперимента сделай конкатенацию символов строки и убедись, что в результате будет верная строка, несмотря на то, что переменная цикла изхменялась «неверно».
ЮЮ (2008-05-20 12:40:00) [6]> Т.е. значение элемента элемента с номером I будет зависеть
> от значения элемента с номером I-1, то ВСЕ РАВНО цикл будет
> выполняться с high downto 0.
А тв по выводимому FloatToStr(res.ktb[i])) запросто выясняешь какому i это соответстыует?
> Если добавить вывод I, то порядок получается нужным:
И в том и другом случае порядок будет нужным. Считай, это среда неверно отображает значение переменной цикла.
Nucer (2008-05-20 12:35:00) [7]И что самое смешное, если заменить строку в цикле на:
res.ktb[i]:=(res.ktb[i-1]-raw.u1)/ktbc[i];
Т.е. значение элемента элемента с номером I будет зависеть от значения элемента с номером I-1, то ВСЕ РАВНО цикл будет выполняться с high downto 0.
Nucer (2008-05-20 12:30:00) [8]Прошу прощения, цикл вот такой:
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:28:00) [9]Недавно тоже столкнулся с такой проблемой. Код:
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);
Мастер (2008-05-20 11:51:00) [10]
> Чайник © (19.05.08 23:29)
Если компилятор увидит, что в цикле тебе необходим прямой порядок обработки, то он не будет менять границы цикла.
Мастер (2008-05-20 11:49:00) [11]Удалено модератором
Германн (2008-05-20 00:40:00) [12]
> Чайник © (19.05.08 23:29)
>
> В операторе цикла типа
>
> For i:=1 To High(AGroup) do
>
> Посмотрел три раза и ничего не увидел.
Приведи реальный код цикла. Ткнём носом в то, что ты не увидел.
Amoeba (2008-05-20 00:33:00) [13]
> Чайник © (19.05.08 23:29)
Не страдай фигней!
{RASkov} (2008-05-20 00:30:00) [14]> А кусочек кода никак?
Вынести этот кусочек в отдельную процедуру....
DrPass (2008-05-20 00:26:00) [15]
> Посмотрел три раза и ничего не увидел
Значит, плохо смотрел. Повторю еще раз (как матру, для лучшего усваивания :) - такой ошибки, как ты говоришь, быть не может. Никакие действия оптимизатора над циклом for не повлияют на результат работы программы, он все учитывает.
> Это что же, на всю процедуру отключиться оптизизация?
Да
> Это не есть хорошо...
А не надо отключать
> А кусочек кода никак?
Нет. Оптимизатор учитывает в своей работе не кусочки кода, а процедуры целиком.
Чайник (2008-05-19 23:57:00) [16]
> Перед началом процедуры и после нее
Это что же, на всю процедуру отключиться оптизизация? Это не есть хорошо... А кусочек кода никак?
Чайник (2008-05-19 23:55:00) [17]
> А теперь проверь внимательнее свою программу. Потому что
> когда ты используешь счетчик цикла как индекс массива, компилятор
> это видит, и автоматически восстанавливает прямой порядок
> счетчика. Ты что, всерьез думаешь, что в оптимизаторе могут
> быть такие глупые баги? У тебя ошибка в другом месте.
Посмотрел три раза и ничего не увидел. Самое интересное, пока ждал ответов на вопрос - изменил цикл на repeat - until - все заработало как хотел.
DrPass (2008-05-19 23:52:00) [18]
> Заполняю TreeView из массива. Правильная последовательность
> узлов - "психологическая проблема"
Ясно. А теперь проверь внимательнее свою программу. Потому что когда ты используешь счетчик цикла как индекс массива, компилятор это видит, и автоматически восстанавливает прямой порядок счетчика. Ты что, всерьез думаешь, что в оптимизаторе могут быть такие глупые баги? У тебя ошибка в другом месте.
> А куда?
> Поставил перед циклом и после - опять включить:
Перед началом процедуры и после нее
Чайник (2008-05-19 23:41:00) [19]
> 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+}
Anatoly Podgoretsky (2008-05-19 23:35:00) [20]> Чайник (19.05.2008 23:29:00) [0]
Зачем?
Психологические проблемы?