Сравнение булевых переменных

Форум для изучающих FPC и их учителей.

Модератор: Модераторы

Сравнение булевых переменных

Сообщение ya_vanka » 17.02.2014 16:29:41

Есть 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 все работает четко.
Последний раз редактировалось ya_vanka 17.02.2014 16:58:21, всего редактировалось 1 раз.
ya_vanka
новенький
 
Сообщения: 89
Зарегистрирован: 07.08.2013 14:28:41

Re: Сравнение булевых переменных

Сообщение Дож » 17.02.2014 16:47:57

http://wiki.freepascal.org/User_Changes ... bool_types
Оно?

Добавлено спустя 2 минуты 15 секунд:
Кроме того, в приведённом коде нужно в точности знать какой тип у GLBoolean (а чтобы трансформировать его в паскалевский Boolean, нужно сравнивать значение с GL_TRUE).
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: Сравнение булевых переменных

Сообщение ya_vanka » 17.02.2014 17:03:36

GLBoolean = ByteBool

по ссылке описывается ситуация вида BufDown := ord(tbsCheck), а у меня такого нет:

Код: Выделить всё
BufDown := not((Style = tbsCheck) and MouseEntered and Down_p and Down);
ya_vanka
новенький
 
Сообщения: 89
Зарегистрирован: 07.08.2013 14:28:41

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
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: Сравнение булевых переменных

Сообщение ya_vanka » 17.02.2014 18:03:12

Код: Выделить всё
  Down := MouseEntered and MouseDownInClientRect;


При этом MouseDownInClientRect = true(1), а MouseEntered = true(255).

В свою очередь MouseEntered задается как MouseEntered := true;
ya_vanka
новенький
 
Сообщения: 89
Зарегистрирован: 07.08.2013 14:28:41

Re: Сравнение булевых переменных

Сообщение Дож » 17.02.2014 18:10:40

Тогда интересно как задаётся MouseDownInClientRect и какая версия fpc используется.
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: Сравнение булевых переменных

Сообщение ya_vanka » 17.02.2014 18:12:08

Интересно, что если даже 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 секунды:
Все равно спасибо.
ya_vanka
новенький
 
Сообщения: 89
Зарегистрирован: 07.08.2013 14:28:41

Re: Сравнение булевых переменных

Сообщение Дож » 18.02.2014 08:19:20

Будем знать, что ByteBool со странностями.
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: Сравнение булевых переменных

Сообщение xdsl » 18.02.2014 10:31:56

ByteBool правильный. 255 - это все битовые единицы. Поэтому что логическое, что побитовое отрицание гарантированно превращает его из true в false и наоборот.
Код: Выделить всё
begin
writeln(boolean(not(ord(true))));
writeln(boolean(not(ord(bytebool(true)))));
end.
В первом случае даст true, во втором - false.
И вообще, с true=1 нет проблем, если только под boolean отводится один бит оперативной памяти, а не один байт, как обычно.
xdsl
постоялец
 
Сообщения: 131
Зарегистрирован: 15.01.2009 13:49:03

Re: Сравнение булевых переменных

Сообщение Sharfik » 18.02.2014 11:18:29

И тут весело. На днях удивился тоже, примерно такой код:
Код: Выделить всё
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.
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 791
Зарегистрирован: 20.07.2013 01:04:30

Re: Сравнение булевых переменных

Сообщение zub » 18.02.2014 13:33:44

Локальные переменные надо инициализировать.
Это не "удивление", это баг в программе))
[offtopic]ЗЫ я наступал на абсолютно теже грабли перенося проект на фпц)) и boolean и локальные переменные и еще много чего... топик немогу найти, давно было[/offtopic]
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Re: Сравнение булевых переменных

Сообщение Sharfik » 18.02.2014 15:05:19

Zub, статью напиши "Путешествие с граблями из мира Delphi в мир FPC, или грабли переноса" :)
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 791
Зарегистрирован: 20.07.2013 01:04:30

Re: Сравнение булевых переменных

Сообщение zub » 19.02.2014 14:05:15

Не, эт давно было, и что такое delphi я уже забыл)) Еще мне очень мозги повыносила разная последовательность инициализаций-финализаций юнитов при сложных циклических зависимостях их друг от друга, добиться одинаковой последовательности так и не удалось. Согласен что сам дурак, нефиг иметь кучу циклических зависимостей))

Замечу что 99% граблей выполнены руками програмиста и к багам FPC или "превосходству" DELPHI не имеют никакого отношения)). Компиляция программы и там и там - очень хороший баготест - выявляется очень много "корявостей"
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26


Вернуться в Обучение Free Pascal

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 21

Рейтинг@Mail.ru
cron