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

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

Глюк дельфей в консольном приложении


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

TStas ©   (2008-08-24 20:07:00) 

i: LongWord;

For i := 2 to High(LongWord) do ....

Дельфи пишут Loop ... no time. Deleted И действительно, цикл не выполнялся. Чтобы заставить его работать, пришлось на While заменить - стало всё нормально. Что это было?


han_malign   (2008-08-26 10:29:00) [21]


> только читай все подряд, а не только понравившиеся места.

читаю все подряд:
Integer types
Fundamental integer typesinclude Shortint, Smallint, Longint, Int64, Byte, Word, and Longword.

И если Longword - не перечислимый - то просветите меня темного - какой же?


Anatoly Podgoretsky   (2008-08-26 08:54:00) [22]

> Германн  (26.08.2008 1:31:22)  [22]

Склероз - у Борланда одно время cardinal был 31 бит, потом стал 32, при этом многократно менялся исходный тип. Весь мир очень долго на ними смеялся, это же надо придумать cardinal в 31 бит, единственно, что их оправдывает, так это изменяемые константы!!!


Германн   (2008-08-26 01:41:00) [23]


> Германн ©   (26.08.08 01:31) [22]

Не.
Наверно всё-таки я не совсем прав.
Давно это было. Мох истории заслоняет глаза. :(


Германн   (2008-08-26 01:31:00) [24]


> Anatoly Podgoretsky ©   (26.08.08 00:14) [21]
>
>

Переход кардинала был, если мне не изменяет мой склероз при смене Д3 на Д4. Но и при этом переходе менялся размер переменной в два раза. А диапазон"кардинала" продолжал соответствовать диапазонуInteger.


Anatoly Podgoretsky   (2008-08-26 00:14:00) [25]


> Почему-то тип кардинал имеет диапазон в два раза меньший,
>  т. е. стариший бит в нём из вредности не используют и,
> видимо, игнорируют.

Ты что в Д2 что ли программируешь?


Германн   (2008-08-26 00:02:00) [26]


> TStas ©   (25.08.08 22:40) [14]
>
> Цикл на 4 миллиарда интераций нужен, чтобы найти все просты
> да High(LongWord).

Ну и сделал бы цикл  
for i:=Low(Integer) to Higj(Integer)
и получил те же 4 миллиарда итераций, но без глюков.


sniknik   (2008-08-25 23:49:00) [27]

> т. е. стариший бит в нём из вредности не используют
ага, тебя позлить...
Anatoly Podgoretsky ©   (25.08.08 19:22) [11]
> LongWord беззнаковое
а интеджер знаковое, но ты не слушай это все из вредности...


Loginov Dmitry   (2008-08-25 23:47:00) [28]

> Если ограничение, то почему его так тщательно скрывают?


Правильнее сказать это особенность. Никем она не скрывается. Многие на этом спотыкаются. По неопытности. И я также спотыкался (давно), когда цикл for I := 0 to List.Count-1 приводил к зависанию или AV. Теперь эта "галочка" в виде правила "не использовать в цикле for беззнаковые переменные" просто держится в голове. Подобных мелочей в программисткой практике встречается очень много, и не все они очевидны (а чтоб жизнь медом не казалась).


sniknik   (2008-08-25 23:41:00) [29]

> чикл со счётчиком типа LOngWord чудестно работает при меньшем диапазоне.
самообман... кончится как только вылезет за пределы разрешенного типа к которому LongWord "чудесно" приводиться автоматом. тут то тебя и "накрыло".

> Из ответов понял, что это просто глюк оптимизатора.
форум читаешь также избирательно как han_malign хелп? вот же прямым текстом, и дальше повторялось...
Германн ©   (24.08.08 20:17) [1]
> Это твой глюк, а не дельфи. Кто же LongWord использует для переменной цикла?

> Если ограничение, то почему его так тщательно скрывают?
скрывают только от тех кто читает наперекосяк, или думаешь цитаты в [12] из какогото другого, тайного, хелпа?


TStas   (2008-08-25 23:01:00) [30]

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


Loginov Dmitry   (2008-08-25 22:52:00) [31]

> Из ответов понял, что это просто глюк оптимизатора. Глюк
> злобный, но устранимый.


Почему глюк? Скорее ограничение. Используй Integer либо while и ничего "глючить" не будет.


TStas   (2008-08-25 22:40:00) [32]

Цикл на 4 миллиарда интераций нужен, чтобы найти все просты да High(LongWord). После чего можно почти мгновенно раскладывать на просты любое число INt64. Только это всё к делу не относится.
High(LongWord) - это я очень правильно написал. Ну не запоминать же значение верхней границы типа. Кроме того, я же не зря именно LOngWord взял. Почему-то тип кардинал имеет диапазон в два раза меньший, т. е. стариший бит в нём из вредностине используют и, видимо, игнорируют.  
> попробуй сам привести тип констант, сразу станет ясно почему.
К чему? чикл со счётчиком типа LOngWord чудестно работает при меньшем диапазоне. Вопрос же не в том, как решить. Решается всё элементарно - заменой forна   Whileи всё. Вопрос-то почему!
Из ответов понял, что это просто глюк оптимизатора. Глюк злобный, но устранимый.


sniknik   (2008-08-25 20:07:00) [33]

> [Hint] _for.dpr(): FOR or WHILE loop executes zero times - deleted
цикл выполнится 0 раз - удален.
т.е. выкинуто оптимизатором. попробуй сам привести тип констант, сразу станет ясно почему.


sniknik   (2008-08-25 20:00:00) [34]

> Хотя в справке четко указано, что это не так...
не надо выковыривать изюм из булки... те читать в справке только то что нравиться

смотрим
For statements

counter is a local variable (declared in the block containing the for statement) of ordinal type, without any qualifiers.

т.е. переменная должна быть строго определенного типа

смотрим  дальше

Ordinal types

Ordinal types include integer, character, Boolean, enumerated, and subrange types.


ну, а про то, как типы приводятся один к другому должен знать. если что иши в справке, только читай все подряд, а не только понравившиеся места.


Anatoly Podgoretsky   (2008-08-25 19:22:00) [35]

LongWord беззнаковое


han_malign   (2008-08-25 14:18:00) [36]


> Условие counter <= finalValue никогда не выполнится для High(LongWord)

да ну? Условие - counter >finalValue- не вполнится и при переполнении целого должен получиться вечный цикл... Но на практике уже $80000000 - принимается за отрицательное значение и обламывается компилятором... Хотя в справке четко указано, что это не так...

When counter returns the same value as finalValue, statement is executed once more and the for statement terminates. In other words, statement is executed once for every value in the range from initialValue to finalValue. If initialValue is equal to finalValue, statement is executed exactly once.


вполне, казалось бы, безобидный цикл на две итерации:
var w: longword;
begin
  for w:= $7FFFFFFF to $80000000 do begin
     if(w and $FFFFFF = 0)then Writeln(w);
  end;
end;

[Hint] _for.dpr(): FOR or WHILE loop executes zero times - deleted


Ega23   (2008-08-25 13:34:00) [37]


> Непонятно зачем нужен цикл на 4 миллиарда иттераций.


Моделирование ситуации по методу Монте-Карло?


Anatoly Podgoretsky   (2008-08-25 13:22:00) [38]

> han_malign  (25.08.2008 13:10:07)  [7]

Все нормально документировано, никакого бага нет.

>begin
> counter := initialValue;
>   while counter <= finalValue do
>   begin

Условие counter <= finalValueникогда не выполнится для High(LongWord)
Непонятно зачем нужен цикл на 4 миллиарда иттераций.


han_malign   (2008-08-25 13:10:00) [39]


> For i := 2 to High(LongWord) do ....

- это действительно "глюк" компилятора оставшийся с древних времен... Компилятор использует знаковое целое при оптмизации for независимо от типа переменной цикла(насчет int64 - не уверен). Только в старых версиях было хуже - такая конструкция приводила к вечному циклу(в D1 - это словили в давние времена - переход переменной цикла на минус и до морковкиного заговения...), без всяких предупрежедний...


Ega23   (2008-08-25 12:40:00) [40]


> Да и зачем вообще это, где реально может пригодиться?


Ага,

type
 TMyType = packed record
   Field1 : Integer;
   Field2 : Integer;
 end;

wrilte (..., SizeOf(TMyType))


Зачем SizeOf(TMyType) писать, когда можно тупо 8?


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

Наверх

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