Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.05.09;
Скачать: CL | DM;

Вниз

Разница м/у моим любимым 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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.011 c
1-26078
Невидимка
2002-04-26 13:03
2002.05.09
Вывод диалога и сохранение файла...


14-26252
vopros
2002-04-02 11:08
2002.05.09
Как думать и работать при температуре >38 гр тела


7-26277
lun
2002-02-12 01:28
2002.05.09
Как зделать чтобы дочерние окна были видны как отдельные, т.е. не сворачивались с главным окном и были доступны через панель задач.


14-26237
Alx2
2002-04-01 15:17
2002.05.09
четырехмерный куб: местами крышу сносит :)


3-25979
sky3d
2002-04-15 11:34
2002.05.09
Нетривиальный UPDATE