Главная страница
    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.03 c
14-1102335385
Привет!!!!
2004-12-06 15:16
2004.12.26
И как лечить вирус? (не конкретная ситуация а в целом)


4-1100415377
Hensin
2004-11-14 09:56
2004.12.26
Выход из ждущего режима


14-1102493504
PRM
2004-12-08 11:11
2004.12.26
Чем открыть файл xmlsdkdoc.msm


1-1103056989
Kolan
2004-12-14 23:43
2004.12.26
Чё то я забыл как из типизированного файла считать.


4-1100453172
dolphin
2004-11-14 20:26
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский