ИНФО: неинициализированный массив

Для неординарных вопросов. Если вы опытный программист, попавший в трудную ситуацию, — вам сюда.

Модератор: gaidar

Правила форума
Этот раздел не предназначен для того, чтобы вы адресовали свою проблему профессионалам.
Этот раздел предназначен для профессионалов, которые столкнулись с проблемой и не могут решить ее самостоятельно.
Если вы считаете себя профессионалом, а свою проблему сложной — вам сюда.
Если модератор посчитает, что вы ошиблись, то на первый раз он перенесет ваше сообщение в основной раздел без последствий для автора. Во второй раз тема будет закрыта, а автору будет выписано нарушение. В третий раз автор будет забанен.
Vi
Постоялец
Постоялец
 
Сообщения: 739
Зарегистрирован: 25.01.2002 (Пт) 11:03
Откуда: Россия, Ижевск

ИНФО: неинициализированный массив

Сообщение Vi » 26.09.2008 (Пт) 14:40

Нашел полезную фичу определения неинициализированного массива (поиском не смог определить есть ли такая информация):
Код: Выделить всё
Dim a() ' As Long, String ...

If (Not a) = -1 Then
Debug.Print "array as not been initialized"
Else
Debug.Print "array as been initialized " & UBound(a)
End If

ReDim a(2)

If (Not a) = -1 Then
Debug.Print "array as not been initialized"
Else
Debug.Print "array as been initialized " & UBound(a)
End If



vbskb_info vbskb_hint vbskb_array
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: ИНФО: неинициализированный массив

Сообщение ANDLL » 26.09.2008 (Пт) 14:44

:shock:
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

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

Re: ИНФО: неинициализированный массив

Сообщение Antonariy » 26.09.2008 (Пт) 16:27

Прикольно. Интересно, как это работает и что за число возвращается, когда массив инициализирован.
Лучший способ понять что-то самому — объяснить это другому.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: ИНФО: неинициализированный массив

Сообщение alibek » 26.09.2008 (Пт) 16:55

Antonariy писал(а):Интересно, как это работает и что за число возвращается, когда массив инициализирован.

Скорее всего, указатель. Только непонятно, на что.
Lasciate ogni speranza, voi ch'entrate.

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

Re: ИНФО: неинициализированный массив

Сообщение Хакер » 26.09.2008 (Пт) 18:17

Интересный и полезный косяк с кастованием: массивная переменная (являющаяся указателем на SafeArrayDescriptor) воспринимается как просто обычная Long-переменная, хранящая число. Соответственно возвращается Not от значения этой переменной. Если поставить ещё один Not, то будет опять нормальное значение переменной.

Фишка в том, что вместо просто переменной у нас массивная-переменная, и вместо просто значения — указатель на SA-дескриптор. Таким образом:

Код: Выделить всё
Dim SomeArray() As Long
ReDim SomeArray(33) As Long

AddressOfSafeArrayStructure = Not (Not SomeArray) ' вся фишка


Особо невереющие могут получить адрес массивной переменной и с помощью GetMem4 прочитать оттуда значение — уверяю, будет то же самое, что и Not(Not(...))



Обратимся к статье GSerg'а Сущность массивов в VB. Там автор для получения адреса SA-дескриптора использует следующий код:

Там для этой цели используется вызов VarPtr (через Declare), а затем GetMem4 (тоже через Declare), что катастрофически долго и громоздко, по сравнению с нашим вариантом.

Фактически, мы читаем значение переменной одной лишь инструкцией процессора (как и полагается), а не вызовом двух функций, которые к тому же надо резолвить.

Красота, одним словом. Vi респект за обнаруженный косяк.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

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

Re: ИНФО: неинициализированный массив

Сообщение Viper » 27.09.2008 (Сб) 6:13

Vi, респектище за обнаруженную фичу!
З.Ы. Надо править свой кирпич!
Весь мир матрица, а мы в нем потоки байтов!

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

Re: ИНФО: неинициализированный массив

Сообщение Хакер » 27.09.2008 (Сб) 18:23

Vi, а расскажи, как ты его нашёл? :)

Зачем-то написал видимо Not someArray. Зачем? :)
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Vi
Постоялец
Постоялец
 
Сообщения: 739
Зарегистрирован: 25.01.2002 (Пт) 11:03
Откуда: Россия, Ижевск

Re: ИНФО: неинициализированный массив

Сообщение Vi » 29.09.2008 (Пн) 17:04

Я прочитал об этом на codeguru.
Исходный пост: http://www.codeguru.com/forum/showthread.php?t=461934
Я же помню об этом ресурсе и людях, которым нужна помощь.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН


Вернуться в Раздел для Профессионалов

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

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

    TopList