Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft Access Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 6 7 8 9 10 11 [12] 13 14 15   вперед  Ctrl
 Re: Баги Access  [new]
Владимир Саныч
Member

Откуда: Израиль (причем это 1 человек, а не 2 => прошу на ты)
Сообщений: 40348
СавсемГость
кагбэ... 1 != -1

И как же это значение 1 сидит в переменной, описанной As Boolean?
16 дек 11, 01:39    [11775508]     Ответить | Цитировать Сообщить модератору
 Re: Баги Access  [new]
Бенедикт
Member

Откуда:
Сообщений: 2099
Владимир Саныч,

такого можно достигнуть и другими способами, например через LSet. Но данный конкретный случай видится именно багом.
16 дек 11, 03:15    [11775567]     Ответить | Цитировать Сообщить модератору
 Re: Баги Access  [new]
.ЛП
Guest
Владимир Саныч
СавсемГость
кагбэ... 1 != -1

И как же это значение 1 сидит в переменной, описанной As Boolean?

Очень просто. Например если WinAPI-функцию, возвращающую BOOL (сиплюсплюсный бул, который на самом деле инт), задекларить как возвращающую Boolean (вебешный), то именно так и будет - в Boolean окажется 1 вместо -1.
16 дек 11, 11:08    [11776317]     Ответить | Цитировать Сообщить модератору
 Re: Баги Access  [new]
.ЛП
Guest
В общем, это не баг аксеса, это баг VB. Или даже скорее так - кривые руки программера, который не умеет апишные функции декларить.
16 дек 11, 11:10    [11776326]     Ответить | Цитировать Сообщить модератору
 Re: Баги Access  [new]
booby
Member

Откуда:
Сообщений: 1459
Дело не в единице. Там любое двухбайтное целое может оказаться.
Об эту бяку я споткнулся года 4-5 назад. Кажется, даже топик здесь был.
Тогда официальная дока на некий класс автоматизации сказала мне, что свойство возвращает булеан, во что я поверил, а он, такой-сякой, единицу мне в булеан запихивал.

Сейчас попробовал думать – баг это или фича. Решил, что баг - на таком основании:

Если бы это была фича, то кроме двухбайтных целых можно было бы напрямую, без copymemory или putmem в булеан любую букву запихнуть. Однако, это не так – проверка типа в примере VladK происходит. Значит, какой-то кусок механизма приведения типов отрабатывает (проверка совместимости объявленных типов), а какой-то нет – частично не работает для этого случая встроенное преобразование.
Слово частично означает следующее – если в процедуре GetP присваивать строку "3003" то произойдет преобразование к ближайшему совместимому типу – Integer и значение отлично присвоится в целевой boolean, а если присваивать букву – "K", то произойдет ошибка преобразования типов
Для фичи было бы прилично не проверять совместимость типов совсем и ошибку выдавать как раз для первого случая (попытки присвоения строки "3003") – вроде переполнения целого.
А так получается, что приведение к ближайшему совместимому числовому типу работает, а встроенное преобразование при этом выключается.
Дальше все ломается и логическое значение ведет себя как неотрицаемое - т.е. значение тождественно равно своему отрицанию.
и даже
b = cbool(b) его уже не лечит
Лечить может правильно подобранный OR - типа If b Then (b or -1)



модифицированный тест теста


+
Sub t1()
Dim b As Boolean
GetP b
b = CBool(b)
If b Then
    Debug.Print "check 1: b is true"
Else
    Debug.Print "check 1: b is false"
End If

If Not b Then
    Debug.Print "check 2: b is false"
Else
    Debug.Print "check 2: b is true"
End If

Debug.Print "check 3: b is " & b
Debug.Print b, b Or 4

Dim v As Variant
v = False
GetP v

If v Then
    Debug.Print "check 104: v is true"
Else
    Debug.Print "check 104: v is false"
End If

If Not b Then
    Debug.Print "check 204: v is false"
Else
    Debug.Print "check 204: v is true"
End If

Debug.Print "check 304: v is " & v
Debug.Print v, v Or 4


End Sub

Sub GetP(ByRef pOut As Variant)
  Dim bb As Boolean
  pOut = "3003" 'AscW("K")' "K" '1
     
End Sub
16 дек 11, 12:31    [11776859]     Ответить | Цитировать Сообщить модератору
 Re: Баги Access  [new]
booby
Member

Откуда:
Сообщений: 1459
повтор:
Лечить может правильно подобранный OR - типа If b Then b = (b or -1)
16 дек 11, 12:33    [11776869]     Ответить | Цитировать Сообщить модератору
 Re: Баги Access  [new]
Бенедикт
Member

Откуда:
Сообщений: 2099
booby,

b=CInt(b)
16 дек 11, 13:19    [11777099]     Ответить | Цитировать Сообщить модератору
 Re: Баги Access  [new]
Бенедикт
Member

Откуда:
Сообщений: 2099
booby,

у меня соображения, что это баг, примерно те же. Передача варианта параметром по ссылке в процедуру должна быть безопасна и подвергаться необходимой проверке и преобразованию типа, с точки зрения языка, в отличие от небезопасных (отданных на откуп программиста) вызовов LSet, и внешних функций, осуществляющих изменение памяти по переданному адресу. Здесь же кто-то решил срезать угол (или банально недосмотрел), основываясь на единстве внутреннего представления Boolean и Integer. И получился баг компилятора.
16 дек 11, 13:28    [11777166]     Ответить | Цитировать Сообщить модератору
 Re: Баги Access  [new]
СавсемГость
Guest
возможно, ОФФ. Если так, - уважаемые модераторы, удалите пост во избежание.

booby,
Дело не в единице. Там любое двухбайтное целое может оказаться.
{могабукаф поскипано}


+ А маны - для кого?
Boolean Data Type


Boolean variables are stored as 16-bit (2-byte) numbers, but they can only be True or False. Boolean variables display as either True or False (when Print is used) or #TRUE# or #FALSE# (when Write # is used). Use the keywords True and False to assign one of the two states to Boolean variables.

When other numeric types are converted to Boolean values, 0 becomes False and all other values become True. When Boolean values are converted to other data types, False becomes 0 and True becomes -1.

ЗЫ: и не "лечить" надо, а курить... всё те-же маны. До полного. И окончательного.
16 дек 11, 13:31    [11777198]     Ответить | Цитировать Сообщить модератору
 Re: Баги Access  [new]
booby
Member

Откуда:
Сообщений: 1459
Бенедикт
booby,

b=CInt(b)


Да, но это двойное преобразование типа.
Всего лишь подтверждает тИповую неполноценность boolean.

2СавсемГость

я рад тому, что вам хочется что-то сказать.
Жаль только, что вы ничего не говорите.
16 дек 11, 13:43    [11777291]     Ответить | Цитировать Сообщить модератору
 Re: Баги Access  [new]
СавсемГость
Guest
booby,
к чему слова, когда на небе звёзды?
Под спойлер из моего предидущего поста заглядывали?
16 дек 11, 13:50    [11777351]     Ответить | Цитировать Сообщить модератору
 Re: Баги Access  [new]
booby
Member

Откуда:
Сообщений: 1459
[quot СавсемГость]...
к чему слова, когда на небе звёзды?
...[quot]

Претензия на дискурс не может заканчиваться просто подъемом к небу глаз.
Попробуйте сформулировать свою идею так, чтобы можно было к ней отнестись как логической пропозиции.
Может быть тогда все читатели одновременно ахнут, и отрукоплещут вас. Или вам.
А пока лишь вспомнается французский горожанин, мечтающий о смене социального статуса.
16 дек 11, 14:58    [11778083]     Ответить | Цитировать Сообщить модератору
 Re: Баги Access  [new]
СавсемГость
Guest
booby,
под спойлер-таки не заглядывали :)
Там цитата из справки по VBA:

Boolean Data Type

Boolean variables are stored as 16-bit (2-byte) numbers, but they can only be True or False. Boolean variables display as either True or False (when Print is used) or #TRUE# or #FALSE# (when Write # is used). Use the keywords True and False to assign one of the two states to Boolean variables.

When other numeric types are converted to Boolean values, 0 becomes False and all other values become True. When Boolean values are converted to other data types, False becomes 0 and True becomes -1.


Идея проста: функционал, не описаный явно, разработчиком не гарантируется. И "багом" быть не может :)
16 дек 11, 16:26    [11779002]     Ответить | Цитировать Сообщить модератору
 Re: Баги Access  [new]
booby
Member

Откуда:
Сообщений: 1459
вот теперь я вас понял.

ваша цитата:
When other numeric types are converted to Boolean values, 0 becomes False and all other values become True.

Здесь не написано явно, что Not True = False
Значите это не гарантируется и багом не является ситуация, когда not True = True
Иными словами, если Debug.print b показывает True, то не гарантируется,
что debug.print b , not b покажет true, False

Спасибо за разъяснения. Вот теперь все совершенно понятно.

(не знаю только, куда деть такое понимание. Может есть конструктивные предложения?)
16 дек 11, 16:39    [11779100]     Ответить | Цитировать Сообщить модератору
 Re: Баги Access  [new]
СавсемГость
Guest
booby,
Здесь не написано явно, что Not True = False
Значите это не гарантируется и ...

Я процитировал не всю справку по VBA
Сорри, не удержался.

...и багом не является ситуация, когда not True = True
от комментария воздержусь

Иными словами, если Debug.print b показывает True, то не гарантируется,
что debug.print b , not b покажет true, False
Совершенно верно. Не гарантируется. Внимательно перечитайте раздел Not Operator в справке VBA.
16 дек 11, 16:56    [11779260]     Ответить | Цитировать Сообщить модератору
 Re: Баги Access  [new]
.ЛП
Guest
Скажите, может быть в справке (совершенно случайно) написано, что 2*2=4?
Если нет, то наверное не стоит считать багом цифру 5, выданную конструкцией Debug.Print 2*2
Ясность полная.

"не знаю только, куда деть такое понимание" (с)
16 дек 11, 18:34    [11779903]     Ответить | Цитировать Сообщить модератору
 Re: Баги Access  [new]
СавсемГость
Guest
.ЛП,
не поверите, написано. Не дословно, конечно. Но, что есть, то есть.

ЗЫ: вброс защитан!
16 дек 11, 18:41    [11779932]     Ответить | Цитировать Сообщить модератору
 Re: Баги Access  [new]
.ЛП
Guest
СавсемГость
не поверите, написано. Не дословно, конечно. Но, что есть, то есть.

Не поверите, но если уж "не дословно, конечно", то там написано и про то, что Not True = False
19 дек 11, 10:16    [11786952]     Ответить | Цитировать Сообщить модератору
 Re: Баги Access  [new]
СавсемГость
Guest
.ЛП
Не поверите, но если уж "не дословно, конечно", то там написано и про то, что Not True = False

Not True = False
но не
Not 1 = False
19 дек 11, 10:39    [11787096]     Ответить | Цитировать Сообщить модератору
 Re: Баги Access  [new]
.ЛП
Guest
СавсемГость
.ЛП
Не поверите, но если уж "не дословно, конечно", то там написано и про то, что Not True = False

Not True = False
но не
Not 1 = False

Сказано же по-русски
Boolean variables ... can only be True or False

Какое слово непонятно? Если все слова понятны, то какое такое 1?

Упорствуете в своём "не баг" - ваше право. Только тогда придётся хелп сжевать. Или перестать на него ссылаться.
Или крестик снять, или трусы надеть.
19 дек 11, 10:43    [11787118]     Ответить | Цитировать Сообщить модератору
 Re: Баги Access  [new]
СавсемГость
Guest
.ЛП,
что ж так разволновало ?
Какое слово непонятно? Если все слова понятны, то какое такое 1?

11774029
19 дек 11, 10:56    [11787194]     Ответить | Цитировать Сообщить модератору
 Re: Баги Access  [new]
СавсемГость
Guest
.ЛП
Сказано же по-русски
Boolean variables ... can only be True or False

Какое слово непонятно?


.ЛП,
учимся читать всю статью, а не только понравившиеся части:
Use the keywords True and False to assign one of the two states to Boolean variables.

Какое слово не понятно ?
19 дек 11, 11:31    [11787432]     Ответить | Цитировать Сообщить модератору
 Re: Баги Access  [new]
.ЛП
Guest
СавсемГость
учимся читать всю статью, а не только понравившиеся части:
Use the keywords True and False to assign one of the two states to Boolean variables.

Какое слово не понятно ?

Алё, Вась?
То, что "use keywords" - как то отменяет то, что "can only be"?
Принимается односложный ответ. Типа да/нет/не знаю/знаю, но не скажу.
После этого и поговорим.

четателей развелось, тля, плюнуть некуда :)
19 дек 11, 13:32    [11788491]     Ответить | Цитировать Сообщить модератору
 Re: Баги Access  [new]
Владимир Саныч
Member

Откуда: Израиль (причем это 1 человек, а не 2 => прошу на ты)
Сообщений: 40348
.ЛП, что-то ты многословен стал. Стареешь, наверно.
19 дек 11, 14:44    [11789300]     Ответить | Цитировать Сообщить модератору
 Re: Баги Access  [new]
.ЛП
Guest
Владимир Саныч
.ЛП, что-то ты многословен стал. Стареешь, наверно.

Звиняй, борода, похмелье случилось :)
19 дек 11, 14:57    [11789443]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 6 7 8 9 10 11 [12] 13 14 15   вперед  Ctrl
Все форумы / Microsoft Access Ответить