Фича: If (not (arr))=-1 then Всегда ли это работает?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Фича: If (not (arr))=-1 then Всегда ли это работает?

Сообщение arthur2 » 16.02.2009 (Пн) 8:28

Нашёл здесь на форуме замечательную фичу:

Код: Выделить всё
dim arr() as myType
If (not (arr))=-1 then Msgbox "Массив не проиницализован"


Но смущает одна цитата:

Хакер писал(а):А вообще GSerg говорил, что эта фича (которая на самом деле глюк) работает не всегда.


Скажите пожалуйста, при каких обстоятельствах это может не срабатывать? А то как-то боязно использовать :oops:
Последний раз редактировалось arthur2 16.02.2009 (Пн) 21:28, всего редактировалось 2 раз(а).
Артур
 
   

GDK
Обычный пользователь
Обычный пользователь
 
Сообщения: 80
Зарегистрирован: 23.10.2008 (Чт) 16:15

Re: Проинициирован ли массив?

Сообщение GDK » 16.02.2009 (Пн) 10:29

Код: Выделить всё
dim arr() as myType

dim i as Long
i=-1
On Error resume Next
i=Ubound(arr())
On Error GoTo  0       'Сомневаюсь в необходимости этой строчки, но использую (чтобы "не было боязно").
If i=-1 then Msgbox "Массив не проиницИализИРОван"


Так может быть будет лучше(надёжнее)?

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Проинициирован ли массив?

Сообщение arthur2 » 16.02.2009 (Пн) 11:07

Не, ну это-то как раз вполне понятно :) Но больно громоздко, а в отдельную функцию не вынесешь - массивы могут быть разного типа.

Кстати, а кто сказал что массив не может быть проинициализирован redim arr(-2 to -1) И тогда наш понятный и простой код выдаст ошибочный результат :)
Так что лучше так:
Код: Выделить всё
If err.number then Msgbox "Массив не проиницИализИРОван"
Артур
 
   

GDK
Обычный пользователь
Обычный пользователь
 
Сообщения: 80
Зарегистрирован: 23.10.2008 (Чт) 16:15

Re: Фича: If (not (arr))=-1 then Всегда ли это работает?

Сообщение GDK » 17.02.2009 (Вт) 14:37

Не хочется отклоняться от темы, но всё же наверное лучше не использовать это, а попробовать решить по нормальному.
Короче, где то встречал с применением IsMissing и типом Variant. По моему в Faq на исходниках.ру. Там не так громоздко. Ну а насчёт -2,-1 можно 0,5 (часто употребимое в России число :eye: ). Вот только насколько всё это быстро будет выполняться? :?

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: Фича: If (not (arr))=-1 then Всегда ли это работает?

Сообщение Viper » 17.02.2009 (Вт) 14:47

Официальных способов два - ловить исключение (ошибку), причем в отдельной процедуре либо воспользоваться методом GSerg, описанным в статье и реализованном в Кирпичах. Кирпичей для работы с массивами у нас кстати два.
Весь мир матрица, а мы в нем потоки байтов!

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Фича: If (not (arr))=-1 then Всегда ли это работает?

Сообщение arthur2 » 17.02.2009 (Вт) 16:20

Viper
Про массивы читал много, со структурой SAFEARRAY знаком, про метод GSerg тоже в курсе. По-моему, он ни чуть не более офицален, чем эта фича :) Оба кирпича для меня уже давно как родные. Я даже как-то сращивал байтовый массив со строкой, и это мне даже удалось :roll:
ловить исключение (ошибку), причем в отдельной процедуре

Как раз это-то и проблематично, если массив своего типа.

Собственно, вопрос был не в том, как узнать, проинициализирован ли массив. Вопрос был вполне конкретный: в чём может оказаться подвох именно и конкретно у этого метода :oops:
Артур
 
   

VBTerminator
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 415
Зарегистрирован: 19.11.2008 (Ср) 20:10

Re: Проинициирован ли массив?

Сообщение VBTerminator » 18.02.2009 (Ср) 12:18

arthur2 писал(а):а в отдельную функцию не вынесешь - массивы могут быть разного типа.

Почему?
Код: Выделить всё
Private Function ArrayIsCreated(MyArr() As Variant) As Boolean
       On Error resume Next

       dim i as Long
       i = Ubound(MyArr())
       ArrayIsCreated = Not (i = -1)
End Sub

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Фича: If (not (arr))=-1 then Всегда ли это работает?

Сообщение arthur2 » 18.02.2009 (Ср) 12:43

Потому что вариант не может принимать пользовательский тип :(

Кстати, твой код нужно поправить:
Код: Выделить всё
ArrayIsCreated = err.number
Артур
 
   

VBTerminator
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 415
Зарегистрирован: 19.11.2008 (Ср) 20:10

Re: Фича: If (not (arr))=-1 then Всегда ли это работает?

Сообщение VBTerminator » 18.02.2009 (Ср) 13:07

arthur2 писал(а):Кстати, твой код нужно поправить

Нас интересует вопроос, создан ли массив, и можно ли с ним нормально работать.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Фича: If (not (arr))=-1 then Всегда ли это работает?

Сообщение arthur2 » 18.02.2009 (Ср) 13:53

Если нас интересует именно этот вопрос, то твой код выдаст правду для непроинициализованного массива . Потому что i останется 0 :) К тому же, как я уже говорил, код неприменим к массивам пользовательских типов

Но нас интересует совсем не этот вопрос, а
Viper писал(а):Вопрос был вполне конкретный: в чём может оказаться подвох именно и конкретно у этого метода :oops:
то есть, у того метода, который вынесен в заголовок.
Артур
 
   

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Фича: If (not (arr))=-1 then Всегда ли это работает?

Сообщение arthur2 » 25.03.2009 (Ср) 13:47

Подниму-ка я тему, пока Хакер здесь...

Тем более, что вопрос как раз к нему :)
Артур
 
   

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

Re: Фича: If (not (arr))=-1 then Всегда ли это работает?

Сообщение Хакер » 25.03.2009 (Ср) 15:22

Вопрос сформурлируй конкретно.

Если вопрос содержится в сабже, то я отвечу так:
Вообще, я думаю, что работать будет всегда.
С другой стороны, иностранные знакомые ГСерг'а говорили, что не всегда. Возможно, знакомые просто ошиблись.

Прежде всего, давай уясним, что происходит. Имеет место быть баг компилятора: вместо того, чтобы выдать сообщение об ошибке, компилятор успешно компилирует этот код так, как если бы вместо arr был указатель на SA-дескриптор (ну изнутри так и есть).

Т.е. такое поведение жестко зашивается в код. Исходя из этого, надо думать, что вопрос "всегда ли это будет работать" надо задавать применительно не к нескольким попыткам запуска одной и той же такой программы, а к нескольким попыткам компиляции.

Т.е. иными словами: "Всегда ли это скомплируется так, как я ожидаю".

Я не могу быть уверенным на этот счёт, но я думаю, что всегда. Ну, возможно от SP зависит, хотя вряд ли.

С другой стороны, я ещё раз настоятельно рекомендую две вещи:
  • Писать не Not(x) = -1, а Not(Not(x)) = 0. И вообще использовать Not(Not(x)) вместо ArrPtr
  • Всё-таки помнить, что это баг, и в ответственных местах не прибегать к его использованию.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Фича: If (not (arr))=-1 then Всегда ли это работает?

Сообщение arthur2 » 25.03.2009 (Ср) 15:39

Спасибо! Ответ меня полностью устраивает!

Про "не Not(x) = -1, а Not(Not(x)) = 0": вы в том топике с тёмычем не доспорили, так что я и не стал пока ничего у себя менять.

И вообще использовать Not(Not(x)) вместо ArrPtr

:D

Ну, возможно от SP зависит, хотя вряд ли.
Это от сервис пака, что ли?
Артур
 
   

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

Re: Фича: If (not (arr))=-1 then Всегда ли это работает?

Сообщение Хакер » 25.03.2009 (Ср) 15:56

Про "не Not(x) = -1, а Not(Not(x)) = 0": вы в том топике с тёмычем не доспорили, так что я и не стал пока ничего у себя менять.

А что там за спро был, напомни?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Фича: If (not (arr))=-1 then Всегда ли это работает?

Сообщение arthur2 » 25.03.2009 (Ср) 16:05

Он спрашивал, действительно ли ты проверял, что именно так скомпилируется, просто опустив все ноты, или это только твое предположение :)

viewtopic.php?p=6706645#p6706645
Артур
 
   

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

Re: Фича: If (not (arr))=-1 then Всегда ли это работает?

Сообщение Хакер » 25.03.2009 (Ср) 16:12

Проверял.

Но даже если бы ноты не убрались, Not(Not(Arr) — осмысленное число (адрес SA), а Not(Arr) — нет.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Фича: If (not (arr))=-1 then Всегда ли это работает?

Сообщение arthur2 » 25.03.2009 (Ср) 16:38

Ок, теперь для меня этот вопрос решён полностью :)
Артур
 
   


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

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

Сейчас этот форум просматривают: SemrushBot, Yandex-бот и гости: 15

    TopList