Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Оператор цикла For - порядок выполнения [D7, XP]


Страницы:   1 2

Чайник ©   (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]

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо