![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Цикл for, так нелюбимый компилятором [D7]
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));
Сколько цикл ни крути результат один и тот же. Даже компилятор видит :)