Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.12.26;
Скачать: CL | DM;

Вниз

Глюк компилятора (в 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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.023 c
4-1100415377
Hensin
2004-11-14 09:56
2004.12.26
Выход из ждущего режима


6-1097421215
Delphis
2004-10-10 19:13
2004.12.26
Поиск сервера


6-1097349683
Ralf
2004-10-09 23:21
2004.12.26
Поиск компьютеров


6-1097321201
QuestionX
2004-10-09 15:26
2004.12.26
Клиент - сервер проблема синхронизации


14-1102307446
Урфин Джюс
2004-12-06 07:30
2004.12.26
Do not localize