True = 1 - третье состояние Boolean

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

True = 1 - третье состояние Boolean

Сообщение Andrey Fedorov » 05.03.2008 (Ср) 13:41

Интересный глюк - столкнулся впервые - оказывается переменная типа Boolean может иметь значение True = 1:

На форме ToolBar, у него есть кнопка с ButtonMenu, в событии ButtonMenuClick прописано:

Код: Выделить всё
If Not ButtonMenu.Visible Then Exit Sub


При видимой кнопке и ButtonMenu.Visible = True выполняется Exit Sub.
В отладчике ButtonMenu.Visible показывается как Boolean со значением True.

Заинтересовало - пробую:

Код: Выделить всё
Dim b As Boolean
d = ButtonMenu.Visible
If Not b Then Exit Sub


b присваивается True и опять Exit Sub.

Далее:

Код: Выделить всё
Debug.Print CLng(ButtonMenu.Visible)
Debug.Print CLng(CBool(ButtonMenu.Visible))
b = CBool(ButtonMenu.Visible)
Debug.Print CLng(b)


Во всех случаях имеем 1. Хотя

Код: Выделить всё
b = 1
Debug.Print CLng(b)
b = CBool(1)
Debug.Print CLng(b)


Дает как и положено -1...
----------
В общем выходит что ButtonMenu.Visible возвращает значение True = 1 типа Boolean, которое умудряется успешно пройти через CBool и присвоиться переменной типа Boolean...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Сообщение kibernetics » 05.03.2008 (Ср) 14:05

я где-то читал про это.
особенность бейсика

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 05.03.2008 (Ср) 21:14

kibernetics писал(а):я где-то читал про это.
особенность бейсика


Я такого нигде не встречал.

Переменная Boolean по определению может иметь лишь 2-а значения True (-1) и False (0). Однако ButtonMenu.Visible возвращет еще одно значение типа Boolean - True (1). Причем это значение спокойно присваивается и обычной переменой Boolean...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

13GHOST
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 305
Зарегистрирован: 09.01.2004 (Пт) 12:48

Сообщение 13GHOST » 05.03.2008 (Ср) 21:19

я всегда считал, что false - это ноль, а все остальное - true :roll:

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 05.03.2008 (Ср) 21:56

13GHOST писал(а):я всегда считал, что false - это ноль, а все остальное - true :roll:


Да, но Boolean переменная по определению должна хранить лишь два значения True(-1) и False(0), как и функция CBool() должна приводить именно к этим значениям. Иначе становятся невозможны булевы операции. Из-за чего я и наткнулся на данный баг:

Код: Выделить всё
If Not b Then ...


Данное условие срабатывало при b = True ... :lol:

P.S Вчитывайтесь внимательней...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 06.03.2008 (Чт) 0:06

1. Andrey Fedorov
Интересный глюк - столкнулся впервые - оказывается переменная типа Boolean может иметь значение True = 1:

Переменная типа Boolead может иметь все те же значения, что и переменная типа Byte (убедиться в этом можно хотя бы с помощью PutMem1). Это в техническом плане.

Чтобы не было хаоса, VB компилирует код так, что все присвоения вида
[As Boolean] = [НЕ As Boolean]
проходят через абсолютизацию, т.е. правый операнд превращается либо в 0, либо в 255UB (т.е. -1 Singed Byte (True)).

Так, VB считает, что в Boolean-переменной гарантировано содержится либо 0, либо -1. Потому как другое значение туда попасть не может (вспомните о проверке и абсолютизации).

Поэтому, при присвоении вида
[As Boolean] = [As Boolean] происходит простое копирование значения, без проведения каких либо проверок. Это из соображений здравого смысла и оптимизации.

В данном случае мы имеем, что одна из сторон (гадкий тулбар) нарушает соглашение о чистоте Boolean-переменных, и в локальную Boolean-переменную просачивается гадость.

В общем выходит что ButtonMenu.Visible возвращает значение True = 1 типа Boolean, которое умудряется успешно пройти через CBool и присвоиться переменной типа Boolean...

По поводу успешности прохода через CBool.
CBool это не функция, а синтаксическая структура, подобная (BOOL) в сях. Компилятор VB (опять же, из соображений здравого смысла) убирает все конструкции вида:
[As Boolean] = CBool([As Boolean]) заменяя их на простое присвоение.

kibernetics

я где-то читал про это.
особенность бейсика

Фигню пишут. Это не особенность бейсика, это _обычность_ всех языков программирования, которые не делают ежесекундной проверки валидности переменных.

2. Andrey Fedorov
Переменная Boolean по определению может иметь лишь 2-а значения True (-1) и False (0). Однако ButtonMenu.Visible возвращет еще одно значение типа Boolean - True (1). Причем это значение спокойно присваивается и обычной переменой Boolean...

См. выше по поводу спокнойности присвоения.

13GHOST
Нет.
False это 0 (00000000), а True это Not False, т.е. -1 (11111111).

3. Andrey Fedorov

Да, но Boolean переменная по определению должна хранить лишь два значения True(-1) и False(0), как и функция CBool() должна приводить именно к этим значениям. Иначе становятся невозможны булевы операции. Из-за чего я и наткнулся на данный баг:

CBool - это не функция, поэтому она ничего не должна приводить. Как и CInt и CStr. А вот Int и Str, обратно, - функции.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 06.03.2008 (Чт) 1:04

От. Теперь объяснение внятное. Спасибо :lol:
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Сообщение Debugger » 06.03.2008 (Чт) 20:38

Хакер, а я почему-то думал если передать ф-ции CBool любой параметр кроме нолика (123 например), то и CInt(True) должен возвратить то, что ему захочется.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 06.03.2008 (Чт) 22:42

Debugger писал(а):Хакер, а я почему-то думал если передать ф-ции CBool любой параметр кроме нолика (123 например), то и CInt(True) должен возвратить то, что ему захочется.


Точнее если параметром CBool является переменная типа Boolean содержащая какое угодно значение - тогда приведение к типу Boolean не производится. А ButtonMenu.Visible как раз и возвращает значение типа Boolean отличное от стандартного True.

Так что Хакер все правильно описал...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 07.03.2008 (Пт) 9:52

Debugger
CBool - это не функция. Это синтаксическая конструкция.

Чтобы понять, можно посмотреть на аналогию в Си.
Код: Выделить всё
// Int:
a = atoi(b);

// CInt:
a = (int)b;


CТип умирает на этапе компиляции. Компилятор сам решает, что делать в каждом конкретном случае. Выражение с CТип может превратиться в вызов какой-либо rtc-функции, присваивание, тримминг и т.д.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 07.03.2008 (Пт) 10:38

Хакер
False это 0 (00000000), а True это Not False, т.е. -1 (11111111).
Ой!? :lol: Может - FFFFFFFFh? :wink:
А я все практикую лечение травами...

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 07.03.2008 (Пт) 10:39

Вообще-то нет. Boolean - он же байт а не дворд.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 07.03.2008 (Пт) 10:41

Ну ты привел пример DWORD'a нулевого и DWORD'a минусового, последний неверный.

Значение False == FFh
А я все практикую лечение травами...

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 07.03.2008 (Пт) 10:42

Там не хекс же, там 11111111b
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Сообщение Денис » 07.03.2008 (Пт) 10:49

Twister
-1(11111111) это FFh


..а вообще, меня всегда восхищало то, как легко переводится 16-ная система в 2-чную и обратно... Ах ну почему у людей 10 пальцев на руках, а не 16 :-(

1B2 - сто бэдцать два
D24A - дэ тысяч двести сорок а
FFFF - эф тысяч эфсот эфдесят эфть
Последний раз редактировалось Денис 07.03.2008 (Пт) 10:56, всего редактировалось 1 раз.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 07.03.2008 (Пт) 10:52

:lol:
Ну, мне не пришла мысль о двоичной системе счисления...
А я все практикую лечение травами...

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 07.03.2008 (Пт) 11:27

Почти офф-топик:

Boolean variables are stored as 16-bit (2-byte) numbers, but they can only be True or False.


Это из хелпа к VBA Office-2007.
Быть... или не быть. Вот. В чём вопрос?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 07.03.2008 (Пт) 11:35

Как раз не почти. Моя ошибка.

Действительно 2 байта. Я даже могу сказать почему два, а не один. Дело в том что push-иться и pop-ится могут только ворды и дворды, но не байты.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 09.03.2008 (Вс) 0:20

Возьмите к примеру чекбокс - у него тоже может быть три значения (хотя свойство Enable у него тоже типа Boolean).
Первое - установлен;
Второе - не установлен;
Третье - неопределённое состояние (когда галка затемнена и находится в неопределённом состоянии).
Это Ж-ж-ж-ж неспроста (с) Винни-Пух

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 09.03.2008 (Вс) 0:32

И к чему это было?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 09.03.2008 (Вс) 9:13

К тому, что многие до сих пор не понимают, что между формой и содержанием может быть ...дцать трамвайных остановок.
Лучший способ понять что-то самому — объяснить это другому.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 09.03.2008 (Вс) 10:36

А мне кажется, некоторые просто не понимают сути топика. Нет никакого третьего состояния. У Boolean 65536 состояний. Из них валидны и доступны только два.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 09.03.2008 (Вс) 15:23

Хакер писал(а):А мне кажется, некоторые просто не понимают сути топика. Нет никакого третьего состояния. У Boolean 65536 состояний. Из них валидны и доступны только два.

Да ну что ты!
Как быть с чекбоксом который отмечен, но затенён? У него в тот момент какое из двух, указанных тобой, состояние?
Вложения
chkBox.jpg
chkBox.jpg (26 Кб) Просмотров: 877
Это Ж-ж-ж-ж неспроста (с) Винни-Пух

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 09.03.2008 (Вс) 16:06

MsgBox TypeName(Check1.Value)

А потом скажешь, причём тут Boolean. Точнее, причём тут твой Integer-ный Check1.Value.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 09.03.2008 (Вс) 16:18

Хакер писал(а):MsgBox TypeName(Check1.Value)

А потом скажешь, причём тут Boolean. Точнее, причём тут твой Integer-ный Check1.Value.

А как ты проверяешь его состояние?
If Value then...
или if Value = 1 [0,2]?
Это Ж-ж-ж-ж неспроста (с) Винни-Пух

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 09.03.2008 (Вс) 16:19

Сравнивая с константами энума CheckBoxConstants.

Ты скажи, скажи, какое отношение имет integer-ное свойство к обсуждаемой теме?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.


Вернуться в Visual Basic 1–6

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

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

    TopList