![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Разница м/у моим любимым TP7 и Delphi
AlexKniga © (2002-04-24 16:26:00)В данной проге тело цикла в 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 15:44:00) [1]Решение проблемы:
For j := Ord(Low(TCoordinate3D)) to ShortInt(Ord(Pred(i))) do
Тип TCoordinate3D влезает в 8 bit.
Всем спасибо.
Кстати никто не подскажет, в Delphi 6 появились inline-подпрограммы?
AlexKniga (2002-04-25 14:24:00) [2]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 раз.
Johnmen (2002-04-25 14:08:00) [3]Вот у меня Pred(<наименьшее значение перечеслимого типа>) выдает -1 , что вполне логично....
AlexKniga (2002-04-25 14:04:00) [4]Компилятор ошибок и предупреждений не выдает.
В Qwerty предупреждения есть, но только из-за его урезанности.
Перечисляемый тип есть набор констант целого типа:
crX=0; crY=1; и т.д.
И то, что константа для величины предшествующей crX отсутствует не столь важно: Ord(Pred(i)) = $FFFFFFFF
А с учетом декларации функции function Ord(X): Longint;
Сия величина должна трактоваться как знаковое целое ака -1. Ан нет.
Да и тип j целое со знаком, но ...
gek (2002-04-25 13:36:00) [5]For j := crX to Pred(i) do
Если я не ошибаюсь функция Pred(i) в данном случае будет неопределена. Надо делать по-другому.
AlexKniga (2002-04-25 12:57:00) [6]Когда ясна причина обычно решение проблемы найти легко.
Но у меня неполучается Ж(.
Я сменил тип переменной цикла с беззнакового на знаковый и сделал приведение типов.
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
Ваши предложения.