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??


default   (2006-07-26 14:58:00) [41]

"цикл срывается примерно начиная с середины LongWord"
под этим я понимаю - если правая граница цикла более примерно середины LongWord(точно не измерял, но по всей вероятности так оно и есть) цикл не выполняется ни разу


Ketmar   (2006-07-26 14:47:00) [42]

>TUser ©   (26.07.06 14:28) [5]
это так. $FFFFFFFF (максимальное значение LongWord) -- это -1 для Integer.


default   (2006-07-26 14:45:00) [43]

цикл срывается примерно начиная с середины LongWord(точно не считал)
то есть типа компиллер смотрит на LongWord как на число со знаком
пофиксить можно так
procedure TForm1.Button1Click(Sender: TObject);
var i, max: longword;
begin

max := High(LongWord);
for i := 0 to max do
  Label1.Caption := inttostr(i);
end;


TUser   (2006-07-26 14:28:00) [44]

> High(LongWord) -- это -1

Это не так, там четыре на десять в какой-то.

> begin...end ©   (26.07.06 12:23) [2]

Спасибо


Ketmar   (2006-07-26 13:41:00) [45]

насколько я помню -- из-за того, что границы у for проверяются как числа со знаком. а High(LongWord) -- это -1, которое меньше нуля. вот цикл и застрелили. %-)


begin...end   (2006-07-26 12:30:00) [46]

> ЮЮ ©   (26.07.06 12:22) [1]

Нет, причина не в этом. Присвоение значения переменной и запись в свойство -- разные вещи. В первом случае оптимизатор мог оставить от цикла одну итерацию, потому что конечный результат действительно был бы заранее известен. В случае же изменения значения свойства результат вполне мог бы зависеть от числа обращений к нему.


begin...end   (2006-07-26 12:23:00) [47]

> TUser ©   (26.07.06 12:18) [0]

> FOR or WHILE loop executes zero times - deleted

You may see this warning if a FOR loop increments its control variable from a value within the range of Longint to a value outside the range of Longint. For example:

var I: Cardinal;
begin
 For I := 0 to $FFFFFFFF do
...

This results from a limitation in the compiler which you can work around by replacing the FOR loop with a WHILE loop.


(с) Delphi Help


ЮЮ   (2006-07-26 12:22:00) [48]

Потому что достаточно
 Label1.Caption := inttostr( high (longword));

Сколько цикл ни крути результат один и тот же. Даже компилятор видит :)


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

Наверх

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