![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с циклами for [D5, Win2k]
vladnt © (2002-11-22 11:01:00)Добрый день. Проблемка такая:
procedure
...
for i:=0 to 2 do
begin
....
end;
for i:=0 to 2 do
begin
.....
end;
Во втором цикле i принимает значение 3 и убывает до 1.
Первый раз со мной такое,но если сделать так :
procedure
...
for i:=0 to 2 do
begin
....
end;
k:=0;
for i:=k to 2 do
begin
.....
end;
все работает. Неужели так бывает?
han_malign (2002-11-25 11:58:00) [1]
push ECX
mov CX, Count
@1:
..........
loop @1
pop ECX
IKiller (2002-11-25 11:42:00) [2]Это работа оптимизатора. Если ты в цикле не используешь явно значение счетчика, то компилятор заменяет цикл на убывающий, т.к. он отрабатывает немного быстрее.
Andre V. (2002-11-22 13:12:00) [3]Бывало!!!!
Заменил на while do; и забыл о проблеме
SottNick (2002-11-22 13:11:00) [4]не глюки это
не глюки...
vladnt (2002-11-22 13:07:00) [5]DarkGreen
Циклы не маленькие,то что описано выше это для примера.
Всем
Самое страшное , что это уже похоже на глюки.Сейчас работает правильно и при включенной оптимизации.Не знаю, что будет к вечеру.
DarkGreen (2002-11-22 12:47:00) [6]2 Calm ©
Быстрее выполняются не от большого к меньшему, а циклы с постусловием, т.е. repeat until работает быстрее чем while. Многие оптимизирующие компиляторы сами производят замену циклов с предусловием на циклы с постусловием.
2 vladnt
А зачем вообще использовать такие маленькие циклы? Вполне возможно, что при включеной оптимизации компилятор их развернет. (C++ так точно поступит, а вот на счет делфей не знаю)
2 Opuhshii ©
Скорее на одну: mov I, 0 :-)
Calm (2002-11-22 12:35:00) [7]2 Opuhshii © (22.11.02 12:29)
Да я не считаюэто глюками. Я же так и написал.
Это явление можетпоказаться глюком тем, кто не был знаком с данным вопросом.
Opuhshii (2002-11-22 12:29:00) [8]2Calm © (22.11.02 12:11)
да с чего вы взяли что это глюки???,... это оптимизация,. буквально на несколько инструкций, но все же,.. вы навероное не используете счетчик цикла в теле цикла, либо как-то очень не тривиально его используете,.. имхо,...
Свифт (2002-11-22 12:12:00) [9]2 vladnt
это только в отладчике
отладил - верни оптимизацию
Calm (2002-11-22 12:11:00) [10]2 vladnt (22.11.02 12:06)
А если скопмилиться при включенной оптимизации, а затем запустить EXE. Прога будет работать неправильно?
Дело в том, что насколько я понял, глюки со счетчиком цикла (хотя на самом деле они не глюки) должны иметь место только в режиме отладки при просмотре значения счетчика.
vladnt (2002-11-22 12:06:00) [11]Оптимизацию отключил.Работает.Большое спасибо.
Как быть в других проектах? Всегда ее отключать?
Song (2002-11-22 11:19:00) [12]Отключи оптимизацию.
Calm (2002-11-22 11:16:00) [13]Я слышал, что есть какой-то очень хитрый ход с оптимизацией. Компилятор считает, что выполнять цикл всегда удобнее от большего к меньшему. При этом прога работает правильно, но отладчик может показать значения счетчика в обратном порядке.
F1 (2002-11-22 11:11:00) [14]Шаман, однако!!!
Давай полный текст заклинания!!!
Anatoly Podgoretsky (2002-11-22 11:09:00) [15]Все правильно работает, или у тебя неверный результат, тогда код в студию
KoluChi (2002-11-22 11:05:00) [16]не бывает