Массив Byte успешно кастуется к Boolean, и всегда даёт True

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Массив Byte успешно кастуется к Boolean, и всегда даёт True

Сообщение tyomitch » 24.08.2007 (Пт) 14:29

Это бага или фича?
Массив Integer, например, генерирует Type Mismatch
Изображение

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 24.08.2007 (Пт) 15:45

Есть мнение, что переменные кастуются через VariantChangeType. Посему надо ковырять доки к этой функции.
Изображение

Wolfie
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 213
Зарегистрирован: 06.03.2006 (Пн) 18:52
Откуда: Россия, Москва, СЗАО

Сообщение Wolfie » 24.08.2007 (Пт) 16:10

Действительно интересно, особенно что к массиву байт можно применить Not и результат всегда(докажите обратное) будет интерпритирован как True, вот например
Код: Выделить всё
Dim bolVar As Boolean, bytArr() As Byte
bytArr = vbNullString
bolVar = bytArr
Debug.Print bolVar
Debug.Print Not bytArr
bolVar = Not bytArr
Debug.Print bolVar
bolVar = Not Not bytArr
Debug.Print bolVar
напечатает
Код: Выделить всё
True
-1501569 ' Или, что веселее - другое число
True
True
т.е. что с Not, что с его отсутствием (или с Not Not) результат один и тот же: Истина...
··•··•••··•··••·•·•·•···••·•••···•···•••·•··•·•··
C:\> per asper ad astra
'ASTRA' answer: Path 'ASPER' Not Found
684 Errare humanum est!
C:\> _

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 25.08.2007 (Сб) 14:11

Больше загадок:
Код: Выделить всё
Dim b() As Byte
b = "bogus"
Debug.Print CBool(b) ' натурально, печатает строку "bogus" 8-|
Изображение

Wolfie
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 213
Зарегистрирован: 06.03.2006 (Пн) 18:52
Откуда: Россия, Москва, СЗАО

Сообщение Wolfie » 25.08.2007 (Сб) 21:57

Вот, я сначала подумал, чо ВБ массив байт как строку понимает и поэтому так трактует, но вот собственно со строкой CBool делает Type Mismatch,

а главное, что ему (ВБ) все равно - нулевой ли массив, или все байты в нем - нули - все равно Истина...

Код: Выделить всё
Dim bytArr() As Byte, bolVar As Boolean

bytArr = "bogus"

bolVar = bytArr        ' SUCCESS
bolVar = CBool(bytArr) ' ERROR: TYPE MISMATCH


То есть полный прикол - ВБ не может применить функцию CBool к массиву байт, но по умолчанию, простым присвоением делает это на ура =)
··•··•••··•··••·•·•·•···••·•••···•···•••·•··•·•··
C:\> per asper ad astra
'ASTRA' answer: Path 'ASPER' Not Found
684 Errare humanum est!
C:\> _

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 26.08.2007 (Вс) 0:03

Есть мнение, что булевы значения - на самом деле Variant(хотя при передаче VARIANT_BOOL через COM-вызов в стеке валяется 2 байта, а в сях VARIANT_BOOL эквивалентен short (знаковый или нет, не помню)). И у варианта этого после присвоения в vt явно не VT_BOOL.
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 26.08.2007 (Вс) 9:43

Wolfie, твоё предположение несколько сминается тем, что если в качестве строки взять "False", то bolVar = CBool(bytArr) всё равно порождает Type Mismatch (хотя bolVar = CBool(CStr(bytArr)) работает).

keks-n, твоё мнение опровергается, например, вызовами VarPtr для последовательных элементов массива Boolean.
Изображение

Wolfie
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 213
Зарегистрирован: 06.03.2006 (Пн) 18:52
Откуда: Россия, Москва, СЗАО

Сообщение Wolfie » 26.08.2007 (Вс) 17:28

tyomitch а я и не настаивал =) А вот это CBool(CStr(bytArr)) очень интересно, все таки байтовый массив очень близок к String =) Но загадок стало больше чем отгадок... боюсь что мы не скоро придем к ответу...
··•··•••··•··••·•·•·•···••·•••···•···•••·•··•·•··
C:\> per asper ad astra
'ASTRA' answer: Path 'ASPER' Not Found
684 Errare humanum est!
C:\> _

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

Сообщение Antonariy » 26.08.2007 (Вс) 18:05

Действительно, похоже где-то глубоко внутри VB не делает особых различий между строкой и байтовым массивом.
Лучший способ понять что-то самому — объяснить это другому.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 26.08.2007 (Вс) 18:25

Antonariy писал(а):Действительно, похоже где-то глубоко внутри VB не делает особых различий между строкой и байтовым массивом.

Это не фича VB, это стандартные функции VectorFromBstr и BstrFromVector.
И таки-да, строка и байтовый массив свободно присваиваются друг другу.
Но наблюдаемых с Boolean аномалий это нисколько не объясняет.
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 26.08.2007 (Вс) 18:29

Продолжение:
Код: Выделить всё
Dim bt() As Byte, bl As Boolean
bt = "bogus"
bl = bt
Debug.Print Hex(Peek(VarPtr(bl)) And &HFFFF&)


Печатается "F894", независимо от содержимого строки.
Изображение

Wolfie
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 213
Зарегистрирован: 06.03.2006 (Пн) 18:52
Откуда: Россия, Москва, СЗАО

Сообщение Wolfie » 26.08.2007 (Вс) 21:36

А я уже намекал, что строка
Код: Выделить всё
Debug.Print Not bytArr
печатает разные числа при одном и томже значении в массиве но при разном кол-ве операций (не касающихся массива) - и предыдущее высказывание наводит на мысль, что мы имеем дело вроде как с каким-то хэндлом или адресом памяти (отсюда постоянное True, ибо не нулевой же хэндл)? Т.е. возморжно при некоторых случаях, массив возвращает что-то, но не содержимое, а хэдэр структуры? (Хочу отметить, что это лишь мои теории, которыми я надеюсь натолкнуть кого-нибудь на мысль :D )
[offtopic]Надеюсь к моему возвращению дней через 15 кто-нибудь расскажет о том, почему Byte Array так себя ведет[/offtopic]
··•··•••··•··••·•·•·•···••·•••···•···•••·•··•·•··
C:\> per asper ad astra
'ASTRA' answer: Path 'ASPER' Not Found
684 Errare humanum est!
C:\> _


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

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

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

    TopList