Форум: "Начинающим";
Текущий архив: 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