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


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?


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

Наверх

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