Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2004.12.26;
Скачать: [xml.tar.bz2];

Вниз

Глюк компилятора (в Delphi 7)?   Найти похожие ветки 

 
Anton_K ©   (2004-12-02 16:40) [0]

Заметил я тут одну интересную вещь.

Var a,b:Boolean;

a:=Boolean(1); //a:=true;
b:=Boolean(2); //b:=true, или нет?
If a=b then Exit;

Выхода не будет, код будет выполняться дальше. Почему? ИМХО, компилятор генерирует код, который сравнивает 1 и 2. Но насколько я знаю 0 это всегда false, а всё остальное это всегда true (для совместимости с Windows). Поэтому компилятор должен генерировать примерно такой код if ((Byte(a)=0) and (Byte(b)=0)) or ((Byte(a)<>0) and (Byte(b)<>0)) then Exit. Я прав?


 
Плохиш ©   (2004-12-02 16:45) [1]


Anton_K ©   (02.12.04 16:40)
> ИМХО, компилятор генерирует код,

А посмотреть в отладчике не судьба? Заодно и ИМХО провериш.


 
Плохиш ©   (2004-12-02 16:44) [2]


Anton_K ©   (02.12.04 16:40)
> ИМХО, компилятор генерирует код,

А посмотреть в отладчике не судьба? Заодно и ИМХО провериш.


 
VMcL ©   (2004-12-02 16:47) [3]

>>Anton_K ©  (02.12.04 16:40)

Код, который генерируется, Вы можете посмотреть сами, открыв окно CPU Window (Ctrl+Alt+C) в интегрированном в среду Delphi отладчике.


 
Anton_K ©   (2004-12-02 16:50) [4]

>[3]

Я не такой тупой, сам знаю как окно отладчика открыть. Сейчас посмотрю что там компилятор пишит...


 
Плохиш ©   (2004-12-02 16:51) [5]

Плохиш ©   (02.12.04 16:45) [1]
Плохиш ©   (02.12.04 16:44) [2]

Полтергейст, однако :-)


 
Anton_K ©   (2004-12-02 16:57) [6]

Посмотрел я в отладчике. Компилятор сравнивает переменные a и b, как будто они Byte, то есть в данном случае он сравнивает 1 и 2.


 
Рамиль ©   (2004-12-02 16:58) [7]

А где глюк то?


 
TButton ©   (2004-12-02 16:58) [8]

элементарно
под boolean отводится 1 байт
0 - false
все остальное - true
при сравнении рассматриваются чистые байты без определения их типа. т.е. в твоем случае код еквивалентен следующему
Var a,b:Byte;

a:=Boolean(1); //a:=true;
b:=Boolean(2); //b:=true, или нет?
If a=b then Exit;


 
Anton_K ©   (2004-12-02 17:07) [9]

>[8]

А почему не проверяется тип? А то получается что,

a:=Boolean(1); //a:=true;
b:=Boolean(2); //b:=true;
a<>b (true<>true ?)


 
VMcL ©   (2004-12-02 17:23) [10]

>>Anton_K ©  (02.12.04 16:40)

Код, который генерируется, Вы можете посмотреть сами, открыв окно CPU Window (Ctrl+Alt+C) в интегрированном в среду Delphi отладчике.


 
jack128 ©   (2004-12-02 17:39) [11]

Anton_K ©   (02.12.04 16:40)
Глюка компилятора нет. Есть твое непонимание простой вещи. Как только ты начинаешь использовать явное приведение типа - ты вмешиваешся в дела компилятора и все глюки - твои собственные.
Anton_K ©   (02.12.04 17:07) [9]
a:=Boolean(1); //a:=true;
b:=Boolean(2); //b:=true;
a<>b (true<>true ?)

1 и 2 - небулевы константы, а то что ты приводишь их типу boolean - твои личные проблемы, на которые компилятору глубоко фиолетово.


 
TButton ©   (2004-12-02 17:39) [12]


> А почему не проверяется тип? А то получается что,

а потому, что побитово проверяется

      CPU          |    Delphi
--------------------|-------------
00000001<>00000010  |  true<>true
00000001<>00000000  |  true<>false
00000010==00000010  |  true==true


 
Anton_K ©   (2004-12-02 17:57) [13]

Var a,b:ByteBool;

a:=Boolean(1); //a:=true;
b:=Boolean(2); //b:=true, или нет?
If a=b then Exit;

Так всё нормально работает, а я всю жизнь думал что Boolean=ByteBool.


 
Anton_K ©   (2004-12-02 18:02) [14]

Может мне кто-нибудь объяснит какая разница между Boolean и ByteBool и почему с ByteBool всё работает как мне надо?


 
Anton_K ©   (2004-12-02 18:14) [15]

>[11]

Открываем хелп и видим: If such a value appears in a context where a Boolean is expected, the compiler automatically converts any value of nonzero ordinality to True.

А почему в этом случае ничего не конвертируется?


 
jack128 ©   (2004-12-02 18:33) [16]

Anton_K ©   (02.12.04 18:14) [15]
можно более точно, где это в хелпе такое написано?


 
Anton_K ©   (2004-12-02 18:36) [17]

>[16]
В "Boolean types".


 
olookin ©   (2004-12-02 18:38) [18]

var a,b: boolean;

 a:=bool(1);
 b:=bool(2);
 if a=b then Showmessage("ok");

Так все работает...

[15] Anton_K ©   (02.12.04 18:14)

А предложением раньше?
A value of type ByteBool, LongBool, or WordBool is considered True when its ordinality is nonzero. If such a value appears in a context where a Boolean is expected, the compiler automatically converts any value of nonzero ordinality to True.


 
Anton_K ©   (2004-12-02 18:41) [19]

>А предложением раньше?

И что?


 
olookin ©   (2004-12-02 18:42) [20]

Ну вот:

A value of type ByteBool, LongBool, or WordBool is considered True when its ordinality is nonzero. If such a value appears in a context where a Boolean is expected, the compiler automatically converts any value of nonzero ordinality to True.


 
Anton_K ©   (2004-12-02 18:44) [21]

>[20]

Ноконец-то до меня дошло. Спасибо!


 
TUser ©   (2004-12-03 15:06) [22]

Странно другое. Над булевыми переменными определны не операции =, <>, а специальные булевые операторы and, or, ect. Равенство должно бы проверяться так
if not (a xor b) then
но такая штука тоже не работает, хотя написано все, вроде, правильно


 
TUser ©   (2004-12-03 15:33) [23]


> все, вроде, правильно

Нет, TUser. Надо было сначала про Boolean types в хелпе почитать


 
Anatoly Podgoretsky ©   (2004-12-03 15:36) [24]

Не стоит путь Bool и Boolean!
Это в Bool все что не равно нулю является истиной, а Boolean имеет два значения true и false и не надо их привязывать ни к каким числовым значением. Может быть у тебя бы все и прокатило, если бы ты не попросил компилятор не вмешиваться, указав явно, что у тебя подлинные Boolean, что естественно не так.
Правильная для данного случая, для интерпритации числовых значений как Bool такая


a:=1<>0;
b:=2<>0;
If a=b then Exit;


 
Verg ©   (2004-12-03 15:42) [25]


> [24] Anatoly Podgoretsky ©   (03.12.04 15:36)


+1


 
Anatoly Podgoretsky ©   (2004-12-03 15:55) [26]

Verg ©   (03.12.04 15:42) [25]
Ситуация также хорошо расписана в справке про Bool, что когда надо делать. Эта ошибка там фигурирует.


 
iZEN ©   (2004-12-03 17:31) [27]

Сколько же логических типов в Delphi? ;)))
(До чего язык извратили!!)


 
MikeP   (2004-12-03 17:47) [28]

>TUser ©   (03.12.04 15:06) [22]

>if not (a xor b) then
>но такая штука тоже не работает, хотя написано все, вроде, >правильно
вот так должно работать
if (a and b) or (not (a or b)) then exit;


 
Anatoly Podgoretsky ©   (2004-12-03 18:02) [29]

iZEN ©   (03.12.04 17:31) [27]
Чисто Паскаль один и 4 для поддержки Вин ФПИ



Страницы: 1 вся ветка

Форум: "Потрепаться";
Текущий архив: 2004.12.26;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.04 c
4-1100252261
Cosinus
2004-11-12 12:37
2004.12.26
Как получить Handle окна, находящегося под курсором?


3-1101725313
KSergey
2004-11-29 13:48
2004.12.26
Переустановить MDAC


1-1102817066
Hoot
2004-12-12 05:04
2004.12.26
У меня в компоненте есть FItems : TStrings; Как мне перехватить


10-1074607237
morfey-night
2004-01-20 17:00
2004.12.26
динамическое создание TDataModule


1-1102492754
SeZuka
2004-12-08 10:59
2004.12.26
Перехват сообщений





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский