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

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

Цикл for, так нелюбимый компилятором [D7]


Страницы:   1 2 3

TUser ©   (2006-07-26 12:18:00) 

procedure TForm1.Button1Click(Sender: TObject);
var i: longword;
begin
 for i := 0 to high (longword) do
   Label1.Caption := inttostr(i);
end;


пишет, что мол
[Hint] Unit1.pas(30): FOR or WHILE loop executes zero times - deleted

С чего вдруг zero times??


GrayFace   (2006-07-28 05:27:00) [1]

tesseract ©   (26.07.06 15:50) [14]
С первой по последнюю и это не ошибка.

Если ошибку задокументировать, то она превращается в фичу? :)


tesseract   (2006-07-27 21:12:00) [2]

> [46] Ketmar ©   (27.07.06 18:36)

Угу я не против, что они умные.  Просто справки придёть прочесть раз в н-дцать поболее.


Ketmar   (2006-07-27 18:36:00) [3]

ну, положим, умные компиляторы Си вполне в состоянии отличить простой for со счётчиком и инкрементом от более сложного. %-)


TUser   (2006-07-27 18:25:00) [4]

В сях, вроде, не должно быть. Там for - это тот же while, только с другим синтаксисом. Изветсно, что начальное и конечное условие может быть любым, как и инкремент (т.е. - вообще произвольным оператором), а конечное значение счетчика не вычисляется заранее, т.к. никакого счетчика цикло там нет.


tesseract   (2006-07-26 23:01:00) [5]

> ещё интересно, есть-ли подобные кривые вещи в других языках,
> в C/C++,


там ещё сложнее.


default   (2006-07-26 19:10:00) [6]

или так...чёрт его знает...сейчас уже концы с концами нет смысла сводить..


default   (2006-07-26 19:09:00) [7]

+[41]
пардон, это я не так понял
ещё интересно, есть-ли подобные кривые вещи в других языках, в C/C++,
например


default   (2006-07-26 18:23:00) [8]

tesseract ©   (26.07.06 17:37) [32]
это понятно
но Вы ведь сначала указали причиной "явное указание компилятору работать с целым беззнаковым числом."
не надо переварачивать, нехорошо


begin...end   (2006-07-26 18:13:00) [9]

> default ©   (26.07.06 17:54) [38]

Так я ж и не спорю, что логика кривая. Кривая. Но документированная :)


default   (2006-07-26 17:59:00) [10]

почему бы компиляру, например, автоматически не вставлять код для переменной цикла в правой части for и избавить пользователя от подобной галиматьи, по-другому не назовёшь


default   (2006-07-26 17:54:00) [11]

begin...end ©   (26.07.06 17:50) [36]
хорошо, в справке есть, только вот убого это всё-равно...логика кривая, каждый раз на while, вводить переменную для for, ...всё это как-то...не очень


default   (2006-07-26 17:52:00) [12]

tesseract ©   (26.07.06 17:37) [32]
блин про другой пост подумал.....
если отключить, [24] работает


begin...end   (2006-07-26 17:50:00) [13]

> default ©   (26.07.06 17:48) [34]

Так, вроде бы, и не зашифровано ничего :)
"Это следствие ограничения компилятора, которое можно обойти, заменив цикл FOR на WHILE".


tesseract   (2006-07-26 17:48:00) [14]


> от чего этого? с выключенной всё-равно не работает


У меня работает.


default   (2006-07-26 17:48:00) [15]

begin...end ©   (26.07.06 17:40) [33]
я уже видел, поздновато правда
"This results from a limitation in the compiler which you can work around by replacing the FOR loop with a WHILE loop."
можно расшифровать?
tesseract ©   (26.07.06 17:37) [32]
от чего этого? с выключенной всё-равно не работает


begin...end   (2006-07-26 17:40:00) [16]

> default ©   (26.07.06 16:02) [16]

> это написано в справке?

Это написано в справке.


tesseract   (2006-07-26 17:37:00) [17]

Это такая особенность компилятора.

Он смотрит на границы цикла, и видит, что у тебя правая граница -1, а левая - 0  . Т.е цикл не нужно выполнять.

default ©   (26.07.06 16:44) [24]

Ты в цикле используешь переменную, т.е. не константу -1, компилятор НЕ РАССЧИТЫВАЕТ значение границ цикла во время компиляции.

приведение будет выполняться позже - в рантайм.

Хочешь от этого избавиться - выключи оптимизацию в настройках проекта.


default   (2006-07-26 17:21:00) [18]

"явное указание компилятору работать с целым беззнаковым числом." (1)
и это смешно
procedure TForm1.Button1Click(Sender: TObject);
var i: longword;
begin
for i := 0 to LongWord($FFFFFFFF) do
  Label1.Caption := inttostr(i);
end;
это также не работает, хотя тут есть (1)
так кто дурак? компилятор или мы?


tesseract   (2006-07-26 17:15:00) [19]


> default ©   (26.07.06 16:59) [29]


Да нет я просто говорил про особенности работы процессора.

ссылки по этому вопросу.


default   (2006-07-26 16:59:00) [20]

tesseract ©   (26.07.06 16:53) [28]
я не понял Вашей позиции
какие-то невнятные ссылки на особенности реализации работы компилятора
можно точно сформулировать? очень интересно
а то такое ощущение, что Вы просто констатируете действия компилятора и на каждое такое действие говорите "Правильно. Ай да маладец!. Ай да умница!"


Страницы:   1 2 3

Наверх

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