Страница 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:47:57
Дож
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:34:01
Дож
А как произошло присвоение 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 18:12:08
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 не имеют никакого отношения)). Компиляция программы и там и там - очень хороший баготест - выявляется очень много "корявостей"