Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-26099
Tonie
2002-04-25 12:34
2002.05.09
AppServer shut down: Проблема при подключенных клиентах ...


1-26150
Gayrus
2002-04-24 16:41
2002.05.09
Функция


3-26044
Саша
2002-04-17 06:50
2002.05.09
undeclared identifier ttdbase


1-26191
Ghost.
2002-04-24 11:06
2002.05.09
Если вопрос часто повторяется извиняюсь..


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





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский