![]() |
| ||
|
|
Новости |
Поиск |
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??
tesseract (2006-07-26 16:53:00) [21]
> default © (26.07.06 16:50) [27]
Вот так всегда, хочешь человеку помочь, а он оказывается юзером......
default (2006-07-26 16:50:00) [22]tesseract © (26.07.06 16:48) [26]
это, как говорят студенты, и козе понятно
ладно, хотите веровать в правоту компилятора - флаг в руки
оправдывайте его всякой мурой
tesseract (2006-07-26 16:48:00) [23]явное указание компилятору работать с целым беззнаковым числом.
default (2006-07-26 16:47:00) [24]tesseract © (26.07.06 16:30) [22]
а лучше поясните в чём ЛОГИЧЕСКИ неправ пользователь компилятора в каком-то из этих случаях
в сабже и здесь
то есть основания пользователя какие должны быть чтобы он, использовал переменную в правой границе цикла? определения типа счётчика мало?
может быть всё-таки признаем - что компилятор в данном случае неправ
default (2006-07-26 16:44:00) [25]tesseract © (26.07.06 16:30) [22]
ради смеха скажите почему тогда работает
procedure TForm1.Button1Click(Sender: TObject);
var i, max: longword;
begin
max := High(LongWord);
for i := 0 to max do
Label1.Caption := inttostr(i);
end;
default (2006-07-26 16:33:00) [26]tesseract © (26.07.06 16:30) [22]
оставлю это без комментариев(да и что тут комментировать?:))
пусть каждый делает для себя выводы самостоятельно
tesseract (2006-07-26 16:30:00) [27]
> default © (26.07.06 16:28) [21]
+5
Срочно за учебником по теории чисел.
и Основы цифровой схемотехники тоже можно подучить.
ЗЫ : Сорри за флуд
default (2006-07-26 16:28:00) [28]tesseract © (26.07.06 16:25) [20]
мне как, пользователю, компилятора плевать как реализованы его внутренности
мне важна лишь логика
я заявил переменную цикла как LongWord
правую границу установил в пределах LongWord и по смыслу трактовки чисел типа LongWord(то есть как беззнаковых)
ВСЁ! МЕНЯ БОЛЬШЕ НИЧЕГО НЕ ДОЛЖНО ВОЛНОВАТЬ!!!
tesseract (2006-07-26 16:25:00) [29]
> эксперимнт показывает, что компиллер в аналогичных ситуациях
> ведёт себя по-разномуто есть Вы и сейчас станете говорить,
> что ошибки нет ни в каком из этих случаях? а если компилятор
> компилировал бы код как захочет это тоже было бы неошибкой?
>
Вспоминаем про четырёхбайтовое выравнивание, и то что все целые числа переводяться компилятором в 32-битные для повышения скорости кода.
байт всё равно будет cardinal. И твой цикл до минусовых значений просто не дойдёт.
ЗЫ: цикл с longWord и 64-битными регистрами должен работать нормально.
default (2006-07-26 16:20:00) [30]tesseract © (26.07.06 16:12) [18]
я провожу аналогию
LongWord и LongInt - оба по четыре байта, одно трактуется на число без знака, другое со знаком
Byte и ShortInt - оба по одному байту, одно трактуется на число без знака, другое со знаком
эксперимнт показывает, что компиллер в аналогичных ситуациях ведёт себя по-разному
то есть Вы и сейчас станете говорить, что ошибки нет ни в каком из этих случаях? а если компилятор компилировал бы код как захочет это тоже было бы неошибкой?
tesseract (2006-07-26 16:12:00) [31]
> почему, проводя аналогию, компиллер не смотрит на счётчик
> цикла как на переменную типа ShortInt?
размер Byte и LongWord?
default (2006-07-26 16:09:00) [32]DrPass © (26.07.06 15:10) [11]
если бы он приводил к Integer, то цикл бы не начинал выполняться при правой границе равной половине Integer, а не LongWord
опыт+логика=решение проблемы
default (2006-07-26 16:02:00) [33]Мефисто (26.07.06 15:43) [13]
чтобы понять, что не всему виной правая граница High(LongWord)
то есть цикл можно запустить меняя левую границу
tesseract © (26.07.06 15:50) [14]
это написано в справке?
не ошибка?
хорошо, почему тогда когда счётчик цикла имеет тип Byte строка
for i := 0 to High(Byte) do ; будем выполняться заявленное число раз
почему, проводя аналогию, компиллер не смотрит на счётчик цикла как на переменную типа ShortInt?
TUser (2006-07-26 15:54:00) [34]Понял - high(longword) для конмпилятора означает константу типа longint.
tesseract (2006-07-26 15:50:00) [35]
> default © (26.07.06 15:16) [12]
С первой по последнюю и это не ошибка.
Мефисто (2006-07-26 15:43:00) [36]
> for i := high(longword) to high (longword) do
А почему первым не Low?
default (2006-07-26 15:16:00) [37]DrPass © (26.07.06 15:10) [11]
интересно с какой версии и по какую эта ошибка компилятора присутствует
DrPass (2006-07-26 15:10:00) [38]
> TUser © (26.07.06 15:05) [9]
Потому что компилятор неявно приводит число к типу integer. И получается, что у тебя цикл от 0 до -1
default (2006-07-26 15:09:00) [39]TUser © (26.07.06 15:05) [9]
поняли в чём дело-то было?
компиллер смотрит на LongWord как на число со знаком
поэтому для отрицательных чисел(как он думает) цикл и не выполняется(правая граница цикла меньше левой)
чтобы ещё больше в этом убедить достаточно написать
procedure TForm1.Button1Click(Sender: TObject);
var i: longword;
begin
for i := high(longword) to high (longword) do
Label1.Caption := inttostr(i);
end;
то есть для компиллера это цикл в границах -1..-1
цикл выполнится один раз
это же всё требует элементарной сообразительности...
TUser (2006-07-26 15:05:00) [40]
> >TUser © (26.07.06 14:28) [5]
> это так. $FFFFFFFF (максимальное значение LongWord) -- это
> -1 для Integer.
При чем тут integer?