Форум: "Начинающим";
Текущий архив: 2008.10.05;
Скачать: [xml.tar.bz2];
ВнизГлюк дельфей в консольном приложении Найти похожие ветки
← →
Anatoly Podgoretsky © (2008-08-27 00:35) [40]> sniknik (26.08.2008 20:41:34) [34]
> частный случай, видать изза того, что сравнение с переменной в цикле иначе реализовано чем с константой. (асм смотрел? проверь)
> но не переписывать же изза одного случая весь хелп... %), будет не хелп, а "здесь играем, здесь не играем а здесь рыбу заворачивали".
> хотя честно, вот этого я не знал... всегда на хелп полагался.
Я привел три варианта сгенерированого кода, различие большое. Знание значения на этапе компиляции (константы), позволяет сделать другой, более оптимальный код, приводя это к Integer, но это же не позволяет работать на границах или обеспечить должную последовательность.
На самом деле зачем гадать, как это будет для разных услоивий или версий Дельфи, когда есть WHILE и расширеные типы данных, например Int64, которые позволяют сделать надежный и управляемый код.
← →
Германн © (2008-08-27 01:09) [41]Вот кстати тоже о типах.
http://dev2.delphimaster.ru/forum/other/1178872210
← →
han_malign © (2008-08-27 10:49) [42]
> > Ordinal types
> > Ordinal types include integer, character, Boolean, enumerated, and subrange types.
- так, все-таки, Longword, Word, Byte, a также Int64, ShortInt и SmallInt - ordinal types, и если нет - то какие?
> $80000000 -
> какие цифры написаны?
> ... я тут мог и массив RGB задать...
- вообще-то, Pascal - язык высокого уровня, со строгой типизацией данных...
в вашем примере, написаны шестнадцатеричные числа в мнемонике Pascal.
В конкретном контейнере(например итераторе цикла For) - такие данные имеют кокретный смысл...
Например, если итератор цикла For имеет тип Longword - то это соответственно
255
65535
4294967295
256
65536
2147483648
--------------------
For statements:
- initialValue and finalValue are expressions that are assignment-compatible with counter.
Для тех кто в танке:
for dw:= LongWord(0) to LongWord($FFFFFFFF) do
[Hint] _for.dpr(): FOR or WHILE loop executes zero times - deleted
> частный случай, видать изза того, что сравнение с переменной в цикле иначе реализовано чем с константой
- в Pascal цикл For всегда имеет одинаковую реализацию:
1. Проверка условия входа в цикл
2. Инициализация итератора, счетчика и терминирующего значения цикла.
3. Тело цикла.
4. Изменение итератора и счетчика цикла.
5. Сравнение счетчика с терминирующим значением.
Если не совпадает - переход на 3.
В зависимости от оптимизации:
- проверка условия входа в цикл(1.) может быть выкинута на этапе компиляции.
- итератор может выполнять функцию счетчика(чаще всего).
- терминирующее значение может быть задано констатой.
- сравнение(5.) может быть опущено при явной проверке результата изменения счетчика(в Delphi выход из цикла происходит только при взведенном флаге Z - без всяких знаков)
Вот, как раз - проверка условия входа в цикл(1.) - в анализаторе компилятора, и в скомпилированном коде - имеет разную реализацию, что и является глюком...
← →
sniknik © (2008-08-27 14:06) [43]>> Ordinal types
>> Ordinal types include integer, character, Boolean, enumerated, and subrange types.
ну теперь понятно откуда взял... говорю же, читаешь выборочно. взял и составил чего хочется из слов и неважно что к чему относится. (types сдесь относится к subrange, ни к чему больше, проконсультируйся со спецом по грамматике английского языка)
> - так, все-таки, Longword, Word, Byte, a также Int64, ShortInt и SmallInt - ordinal types, и если нет - то какие?
а проверь, и подставь в цикл переменную типа Int64 (единственное автоматом не приведется т.к. размером не вышла).
> Например, если итератор цикла For имеет тип Longword
заход на очередной круг? по справке он там не может иметь тип Longword, и по той же справке тип может приводится автоматом, если размерность позволяет (байт в интеджер легко, иттеджер в байт с ограничениями, и возможным чекранже).
> Для тех кто в танке:
и смысл подобного приведения, если компилятор будет проверять по такому (автоматическое приведение, сколько уже повторялось)
for dw:= integer(LongWord(0)) to integer(LongWord($FFFFFFFF)) do
?
> - в Pascal цикл For всегда имеет одинаковую реализацию:
и это после 3-х (или 4х?) приведенных вариантов?...
повторю, результирующий код не документирован, и может быть любым! (вот в твоем примере с переменной повезло и выдало такую проверку которая при неверном значении верно сработала. но это не обязаловка раз в хелпе не прописано)
кстати вот чего странно, когда тебе было выгодно ты в код CPU залез и привел, а сейчас споришь вместо того чтобы просто посмотреть и убедиться.
спор ради спора?
← →
han_malign © (2008-08-27 16:28) [44]
> заход на очередной круг? по справке он там не может иметь тип Longword
кокретно - место в справке где это написано...
кокретно - где написано, что Longword не перечислимый тип...
> повторю, результирующий код не документирован, и может быть любым!
конкретно - пример - где результирующий код не соответсвует приведенной схеме, хотя бы из тех "3-х (или 4х?) приведенных вариантов"...
"так держать! больше ламеров - меньше конкурентов."(c)sniknik
← →
DiamondShark © (2008-08-27 17:43) [45]
> types сдесь относится к subrange, ни к чему больше, проконсультируйся
> со спецом по грамматике английского языка
Угу. А к enumerated, надо полагать, не относится.
И что, тогда, такое character? Что такое character types, знаю -- это char и widechar, а слова character в Паскале нету.
> повторю, результирующий код не документирован, и может быть
> любым!
Речь идёт не о результирующем коде, а о семантике оператора.
В рассматриваемом случае кода вообще нет, потому что компилятор сравнил константы как знаковые 32-битные, на что права не имел.
Это именно глюк компилятора.
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2008.10.05;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.007 c