Главная страница
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.01 c
7-26284
ray_wagner
2002-02-05 15:57
2002.05.09
Эмуляция активной деятельности компа :-)


1-26125
ruslan_as
2002-04-24 10:07
2002.05.09
цикл


1-26173
finger
2002-04-22 12:13
2002.05.09
Глючит RichText


3-26039
gyg
2002-04-16 21:19
2002.05.09
Можно ли узнать имя пользователя в Interbase?


1-26144
Andreika
2002-04-24 22:24
2002.05.09
CreateProcess и все такое...