Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft Access |
![]() ![]() |
Топик располагается на нескольких страницах: ←Ctrl назад 1 .. 6 7 8 9 10 11 [12] 13 14 15 вперед Ctrl→ |
Владимир Саныч Member Откуда: Израиль (причем это 1 человек, а не 2 => прошу на ты) Сообщений: 40414 |
И как же это значение 1 сидит в переменной, описанной As Boolean? |
||
16 дек 11, 01:39 [11775508] Ответить | Цитировать Сообщить модератору |
Бенедикт Member Откуда: Сообщений: 2099 |
Владимир Саныч, такого можно достигнуть и другими способами, например через LSet. Но данный конкретный случай видится именно багом. |
16 дек 11, 03:15 [11775567] Ответить | Цитировать Сообщить модератору |
.ЛП
Guest |
Очень просто. Например если WinAPI-функцию, возвращающую BOOL (сиплюсплюсный бул, который на самом деле инт), задекларить как возвращающую Boolean (вебешный), то именно так и будет - в Boolean окажется 1 вместо -1. |
||||
16 дек 11, 11:08 [11776317] Ответить | Цитировать Сообщить модератору |
.ЛП
Guest |
В общем, это не баг аксеса, это баг VB. Или даже скорее так - кривые руки программера, который не умеет апишные функции декларить. |
16 дек 11, 11:10 [11776326] Ответить | Цитировать Сообщить модератору |
booby Member Откуда: Сообщений: 2320 |
Дело не в единице. Там любое двухбайтное целое может оказаться. Об эту бяку я споткнулся года 4-5 назад. Кажется, даже топик здесь был. Тогда официальная дока на некий класс автоматизации сказала мне, что свойство возвращает булеан, во что я поверил, а он, такой-сякой, единицу мне в булеан запихивал. Сейчас попробовал думать – баг это или фича. Решил, что баг - на таком основании: Если бы это была фича, то кроме двухбайтных целых можно было бы напрямую, без copymemory или putmem в булеан любую букву запихнуть. Однако, это не так – проверка типа в примере VladK происходит. Значит, какой-то кусок механизма приведения типов отрабатывает (проверка совместимости объявленных типов), а какой-то нет – частично не работает для этого случая встроенное преобразование. Слово частично означает следующее – если в процедуре GetP присваивать строку "3003" то произойдет преобразование к ближайшему совместимому типу – Integer и значение отлично присвоится в целевой boolean, а если присваивать букву – "K", то произойдет ошибка преобразования типов Для фичи было бы прилично не проверять совместимость типов совсем и ошибку выдавать как раз для первого случая (попытки присвоения строки "3003") – вроде переполнения целого. А так получается, что приведение к ближайшему совместимому числовому типу работает, а встроенное преобразование при этом выключается. Дальше все ломается и логическое значение ведет себя как неотрицаемое - т.е. значение тождественно равно своему отрицанию. и даже b = cbool(b) его уже не лечит Лечить может правильно подобранный OR - типа If b Then (b or -1) модифицированный тест теста
|
|
16 дек 11, 12:31 [11776859] Ответить | Цитировать Сообщить модератору |
booby Member Откуда: Сообщений: 2320 |
повтор: Лечить может правильно подобранный OR - типа If b Then b = (b or -1) |
16 дек 11, 12:33 [11776869] Ответить | Цитировать Сообщить модератору |
Бенедикт Member Откуда: Сообщений: 2099 |
booby, b=CInt(b) |
16 дек 11, 13:19 [11777099] Ответить | Цитировать Сообщить модератору |
Бенедикт Member Откуда: Сообщений: 2099 |
booby, у меня соображения, что это баг, примерно те же. Передача варианта параметром по ссылке в процедуру должна быть безопасна и подвергаться необходимой проверке и преобразованию типа, с точки зрения языка, в отличие от небезопасных (отданных на откуп программиста) вызовов LSet, и внешних функций, осуществляющих изменение памяти по переданному адресу. Здесь же кто-то решил срезать угол (или банально недосмотрел), основываясь на единстве внутреннего представления Boolean и Integer. И получился баг компилятора. |
16 дек 11, 13:28 [11777166] Ответить | Цитировать Сообщить модератору |
СавсемГость
Guest |
возможно, ОФФ. Если так, - уважаемые модераторы, удалите пост во избежание. booby,
ЗЫ: и не "лечить" надо, а курить... всё те-же маны. До полного. И окончательного. |
|||
16 дек 11, 13:31 [11777198] Ответить | Цитировать Сообщить модератору |
booby Member Откуда: Сообщений: 2320 |
Да, но это двойное преобразование типа. Всего лишь подтверждает тИповую неполноценность boolean. 2СавсемГость я рад тому, что вам хочется что-то сказать. Жаль только, что вы ничего не говорите. |
||
16 дек 11, 13:43 [11777291] Ответить | Цитировать Сообщить модератору |
СавсемГость
Guest |
booby, к чему слова, когда на небе звёзды? Под спойлер из моего предидущего поста заглядывали? |
16 дек 11, 13:50 [11777351] Ответить | Цитировать Сообщить модератору |
booby Member Откуда: Сообщений: 2320 |
[quot СавсемГость]... к чему слова, когда на небе звёзды? ...[quot] Претензия на дискурс не может заканчиваться просто подъемом к небу глаз. Попробуйте сформулировать свою идею так, чтобы можно было к ней отнестись как логической пропозиции. Может быть тогда все читатели одновременно ахнут, и отрукоплещут вас. Или вам. А пока лишь вспомнается французский горожанин, мечтающий о смене социального статуса. |
16 дек 11, 14:58 [11778083] Ответить | Цитировать Сообщить модератору |
СавсемГость
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] Ответить | Цитировать Сообщить модератору |
booby Member Откуда: Сообщений: 2320 |
вот теперь я вас понял. ваша цитата: 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] Ответить | Цитировать Сообщить модератору |
СавсемГость
Guest |
booby,
![]() Я процитировал не всю справку по VBA Сорри, не удержался.
|
||||||
16 дек 11, 16:56 [11779260] Ответить | Цитировать Сообщить модератору |
.ЛП
Guest |
Скажите, может быть в справке (совершенно случайно) написано, что 2*2=4? Если нет, то наверное не стоит считать багом цифру 5, выданную конструкцией Debug.Print 2*2 Ясность полная. "не знаю только, куда деть такое понимание" (с) |
16 дек 11, 18:34 [11779903] Ответить | Цитировать Сообщить модератору |
СавсемГость
Guest |
.ЛП, не поверите, написано. Не дословно, конечно. Но, что есть, то есть. ЗЫ: вброс защитан! |
16 дек 11, 18:41 [11779932] Ответить | Цитировать Сообщить модератору |
.ЛП
Guest |
Не поверите, но если уж "не дословно, конечно", то там написано и про то, что Not True = False |
||
19 дек 11, 10:16 [11786952] Ответить | Цитировать Сообщить модератору |
СавсемГость
Guest |
Not True = False но не Not 1 = False |
||
19 дек 11, 10:39 [11787096] Ответить | Цитировать Сообщить модератору |
.ЛП
Guest |
Сказано же по-русски
Какое слово непонятно? Если все слова понятны, то какое такое 1? Упорствуете в своём "не баг" - ваше право. Только тогда придётся хелп сжевать. Или перестать на него ссылаться. Или крестик снять, или трусы надеть. Сообщение было отредактировано: 19 дек 11, 10:46 |
||||||
19 дек 11, 10:43 [11787118] Ответить | Цитировать Сообщить модератору |
СавсемГость
Guest |
.ЛП, что ж так разволновало ?
11774029 |
||
19 дек 11, 10:56 [11787194] Ответить | Цитировать Сообщить модератору |
СавсемГость
Guest |
.ЛП, учимся читать всю статью, а не только понравившиеся части: Use the keywords True and False to assign one of the two states to Boolean variables. Какое слово не понятно ? |
||
19 дек 11, 11:31 [11787432] Ответить | Цитировать Сообщить модератору |
.ЛП
Guest |
Алё, Вась? То, что "use keywords" - как то отменяет то, что "can only be"? Принимается односложный ответ. Типа да/нет/не знаю/знаю, но не скажу. После этого и поговорим. четателей развелось, тля, плюнуть некуда :) |
||
19 дек 11, 13:32 [11788491] Ответить | Цитировать Сообщить модератору |
Владимир Саныч Member Откуда: Израиль (причем это 1 человек, а не 2 => прошу на ты) Сообщений: 40414 |
.ЛП, что-то ты многословен стал. Стареешь, наверно. |
19 дек 11, 14:44 [11789300] Ответить | Цитировать Сообщить модератору |
.ЛП
Guest |
Звиняй, борода, похмелье случилось :) |
||
19 дек 11, 14:57 [11789443] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: ←Ctrl назад 1 .. 6 7 8 9 10 11 [12] 13 14 15 вперед Ctrl→ |
Все форумы / Microsoft Access | ![]() |