Форум: "Основная";
Текущий архив: 2002.05.09;
Скачать: [xml.tar.bz2];
ВнизРазница м/у моим любимым TP7 и Delphi Найти похожие ветки
← →
AlexKniga (2002-04-24 16:26) [0]В данной проге тело цикла в TP вообще не выполнится, а в Delphi выполнится $FFFFFFFF раз. Из этого числа, даже, видно почему так будет. Но все равно неприятно.
Program Qwerty;
Type
TCoordinate3D = (crX, crY, crZ);
Var
i, j: TCoordinate3D;
g: Real;
Begin
i := crX;
For j := crX to Pred(i) do
Begin
g := 1.0;
End;
g := Sqr(g); // Если эту строку убрать, то из-за оптимитизации тело цикла не будет включено в exe
End.
← →
AlexKniga (2002-04-25 12:57) [1]Когда ясна причина обычно решение проблемы найти легко.
Но у меня неполучается Ж(.
Я сменил тип переменной цикла с беззнакового на знаковый и сделал приведение типов.
Var
j: Integer;
...
For j := Ord(Low(TCoordinate3D)) to Ord(Pred(i)) do
Но я обломался.
Не помогло и это:
For j := Integer(Low(TCoordinate3D)) to Integer(Pred(i)) do
Хотя при просмотре значений Ord(Pred(i)) = -1
Ваши предложения.
← →
gek (2002-04-25 13:36) [2]For j := crX to Pred(i) do
Если я не ошибаюсь функция Pred(i) в данном случае будет неопределена. Надо делать по-другому.
← →
AlexKniga (2002-04-25 14:04) [3]Компилятор ошибок и предупреждений не выдает.
В Qwerty предупреждения есть, но только из-за его урезанности.
Перечисляемый тип есть набор констант целого типа:
crX=0; crY=1; и т.д.
И то, что константа для величины предшествующей crX отсутствует не столь важно: Ord(Pred(i)) = $FFFFFFFF
А с учетом декларации функции function Ord(X): Longint;
Сия величина должна трактоваться как знаковое целое ака -1. Ан нет.
Да и тип j целое со знаком, но ...
← →
Johnmen (2002-04-25 14:08) [4]Вот у меня Pred(<наименьшее значение перечеслимого типа>) выдает -1 , что вполне логично....
← →
AlexKniga (2002-04-25 14:24) [5]Watch для Ord(Pred(i)) выдает -1 ($FFFFFFFF). Тут вопросов нет.
Но цикл выполняется Cardinal($FFFFFFFF)=4294967295
При прогоне граничные условия выглядят:
$00000000 $FFFFFFFF
For j := Ord(Low(TCoordinate3D)) to Ord(Pred(i)) do
Учитывая, что j целое со знаком:
Integer($00000000) = 0 Integer($FFFFFFFF) = -1
А компилятор не смотря на Var j: Integer; в цикле трактует j как целое без знака. И гоняет цикл Cardinal($FFFFFFFF)=4294967295 раз.
← →
AlexKniga (2002-04-25 15:44) [6]Решение проблемы:
For j := Ord(Low(TCoordinate3D)) to ShortInt(Ord(Pred(i))) do
Тип TCoordinate3D влезает в 8 bit.
Всем спасибо.
Кстати никто не подскажет, в Delphi 6 появились inline-подпрограммы?
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.05.09;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.005 c