Форум: "Потрепаться";
Текущий архив: 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