Главная страница
    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
14-26260
alienb
2002-04-02 17:58
2002.05.09
Как определить имя хоста по IP?


6-26218
skovorodka
2002-02-23 18:22
2002.05.09
Кто знает как переслать картинку по локалке соседнему компу ??


3-25977
Cage
2002-04-14 16:45
2002.05.09
База данных на е.


1-26089
Lokk
2002-04-26 16:04
2002.05.09
Процедура


1-26071
KvORubin
2002-04-23 18:53
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский