Страница 1 из 1
Сравнение булевых переменных
Добавлено: 17.02.2014 16:29:41
ya_vanka
Есть 2 переменных типа ByteBool
Код: Выделить всё
BufDown := not((Style = tbsCheck) and MouseEntered and Down_p and Down); // результат логических операций - true
и
FDown // установлено в true
при этом byte(BufDown) = 255, а byte(FDown) = 1
и что самое неожиданное BufDown = FDown получатся false (255 <> 1), хотя я ожидал результат true
Вопросы:
1. как такое может быть, что true представлено разными значениями (1 и 255)?
2. как сравнивать ByteBool в таком случае
И еще: такая ситуация получается при компиляции в Lazarus. В Delphi все работает четко.
Re: Сравнение булевых переменных
Добавлено: 17.02.2014 16:50:12
Дож
http://wiki.freepascal.org/User_Changes ... bool_typesОно?
Добавлено спустя 2 минуты 15 секунд:Кроме того, в приведённом коде нужно в точности знать какой тип у GLBoolean (а чтобы трансформировать его в паскалевский Boolean, нужно сравнивать значение с GL_TRUE).
Re: Сравнение булевых переменных
Добавлено: 17.02.2014 17:03:36
ya_vanka
GLBoolean = ByteBool
по ссылке описывается ситуация вида BufDown := ord(tbsCheck), а у меня такого нет:
Код: Выделить всё
BufDown := not((Style = tbsCheck) and MouseEntered and Down_p and Down);
Re: Сравнение булевых переменных
Добавлено: 17.02.2014 17:38:42
Дож
А как произошло присвоение Down?
Добавлено спустя 4 минуты 41 секунду:Код: Выделить всё
[doj@korica ~/temp]$ cat bytebool.pas
var
A, B: ByteBool;
begin
A := ByteBool(2);
Writeln(Byte(A));
B := not False;
Writeln(Byte(B));
Writeln(A = B);
end.
[doj@korica ~/temp]$ fpc -Sd bytebool.pas && ./bytebool
2
255
TRUE
[doj@korica ~/temp]$ fpc -iV
2.7.1
Re: Сравнение булевых переменных
Добавлено: 17.02.2014 18:03:12
ya_vanka
Код: Выделить всё
Down := MouseEntered and MouseDownInClientRect;
При этом MouseDownInClientRect = true(1), а MouseEntered = true(255).
В свою очередь MouseEntered задается как MouseEntered := true;
Re: Сравнение булевых переменных
Добавлено: 17.02.2014 18:10:40
Дож
Тогда интересно как задаётся MouseDownInClientRect и какая версия fpc используется.
Re: Сравнение булевых переменных
Добавлено: 17.02.2014 19:44:58
ya_vanka
Интересно, что если даже MouseDownInClientRect = true(1) и MouseEntered = true(1), то MouseEntered and MouseDownInClientRect все равно вернет true(255).
Добавлено спустя 1 минуту 24 секунды:Код: Выделить всё
MouseDownInClientRect := GLboolean(PtInRect(Types.TRect(ControlRect), Types.Point(X, Y)));
FPC 2.6.2
Добавлено спустя 20 минут 42 секунды:Перезапустил среду, пересобрал - заработало...
Добавлено спустя 1 час 10 минут 44 секунды:Все равно спасибо.
Re: Сравнение булевых переменных
Добавлено: 18.02.2014 08:19:20
Дож
Будем знать, что ByteBool со странностями.
Re: Сравнение булевых переменных
Добавлено: 18.02.2014 10:31:56
xdsl
ByteBool правильный. 255 - это все битовые единицы. Поэтому что логическое, что побитовое отрицание гарантированно превращает его из true в false и наоборот.
Код: Выделить всё
begin
writeln(boolean(not(ord(true))));
writeln(boolean(not(ord(bytebool(true)))));
end.
В первом случае даст true, во втором - false.
И вообще, с true=1 нет проблем, если только под boolean отводится
один бит оперативной памяти, а не один байт, как обычно.
Re: Сравнение булевых переменных
Добавлено: 18.02.2014 11:18:29
Sharfik
И тут весело. На днях удивился тоже, примерно такой код:
Код: Выделить всё
var
exist:boolean;
begin
for i:=0 to Count do
begin
if ...item[i] then
exist=true
end;
if not exist then ....
end;
Не работал. Оказалось. что без предварительной моей инициализации в Delphi переменная=false, а в fpc равна true.
Re: Сравнение булевых переменных
Добавлено: 18.02.2014 13:33:44
zub
Локальные переменные надо инициализировать.
Это не "удивление", это баг в программе))
[offtopic]ЗЫ я наступал на абсолютно теже грабли перенося проект на фпц)) и boolean и локальные переменные и еще много чего... топик немогу найти, давно было[/offtopic]
Re: Сравнение булевых переменных
Добавлено: 18.02.2014 15:05:19
Sharfik
Zub, статью напиши "Путешествие с граблями из мира Delphi в мир FPC, или грабли переноса"

Re: Сравнение булевых переменных
Добавлено: 19.02.2014 14:05:15
zub
Не, эт давно было, и что такое delphi я уже забыл)) Еще мне очень мозги повыносила разная последовательность инициализаций-финализаций юнитов при сложных циклических зависимостях их друг от друга, добиться одинаковой последовательности так и не удалось. Согласен что сам дурак, нефиг иметь кучу циклических зависимостей))
Замечу что 99% граблей выполнены руками програмиста и к багам FPC или "превосходству" DELPHI не имеют никакого отношения)). Компиляция программы и там и там - очень хороший баготест - выявляется очень много "корявостей"