Страница: 1 |
Страница: 1 |
Вопрос: проверка инициализации массива
Добавлено: 25.12.10 19:45
Автор вопроса: Winand | Web-сайт:
В инете встречается такой способ для vb6.
if not <arr> = -1 then
'в массиве нет эл-тов
end if
Его использовать нельзя. Возникают ошибки типа Expression too complex. При том совсем в других местах возникают.
з.ы. На дотнете наверняка таких проблем не возникает..
Ответы
Всего ответов: 11
Номер ответа: 1
Автор ответа:
AgentFire
ICQ: 192496851
Вопросов: 75
Ответов: 3178
Профиль | | #1
Добавлено: 25.12.10 19:54
что ты имеешь ввиду под проверкой инициализации массива
Номер ответа: 2
Автор ответа:
Winand
Вопросов: 87
Ответов: 2795
Web-сайт:
Профиль | | #2
Добавлено: 25.12.10 20:04
Я имел в виду, является массив пустым или в нём есть элементы.
Вообще самый простой способ проверки: on error + ubound. Есть еще вариант хранить текущую размерность в переменной, которой изначально задавать -1.
Номер ответа: 3
Автор ответа:
Smith
ICQ: adamis@list.ru
Вопросов: 153
Ответов: 3632
Профиль | | #3
Добавлено: 26.12.10 01:02
Последнее красивее, абаунд становится ненужен.
Номер ответа: 4
Автор ответа:
HIWORD
Вопросов: 0
Ответов: 14
Профиль | | #4
Добавлено: 26.12.10 02:23
Походу, оба способа кривые. Предлагаю еще один:
Номер ответа: 5
Автор ответа:
Winand
Вопросов: 87
Ответов: 2795
Web-сайт:
Профиль | | #5
Добавлено: 26.12.10 12:32
А тут не классно, что нужно передавать в функцию результат другой функции. Загромождение такое в коде.
Номер ответа: 6
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #6
Добавлено: 26.12.10 23:39
а почему просто не проверить на null? Или как там у вас.. Nothing?
Номер ответа: 7
Автор ответа:
HIWORD
Вопросов: 0
Ответов: 14
Профиль | | #7
Добавлено: 27.12.10 02:34
Потому что это бессмысленно.
Dim lngArr() As Long
По адресу якобы неинициализированной lngArr на самом деле хранится структура SAFEARRAY.
В которой член pvData - есть адрес первого элемента массива - &lngArr[0](если массив инициализирован), а, например, cbElements - кол-во элементов в массиве.
Засада в vb6 в получении адреса этой структуры. Поэтому приходится вводить VarPtrArray, которая возвращает "указатель на указатель" структуры, что несколько загромождает код.
Но это точно лучше, чем отдельно хранить размерность с риском ошибиться, или шаманство типа
if not not lngArr then
Номер ответа: 8
Автор ответа:
Winand
Вопросов: 87
Ответов: 2795
Web-сайт:
Профиль | | #8
Добавлено: 27.12.10 18:00
шаманство реально нельзя использовать оно то ли модифицирует указатель, то ли еще какая-то хрень. Я не смог разобраться.
Зато вот такое работает всегда хорошо
Номер ответа: 9
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #9
Добавлено: 28.12.10 19:15
извращенство..
Номер ответа: 10
Автор ответа:
Winand
Вопросов: 87
Ответов: 2795
Web-сайт:
Профиль | | #10
Добавлено: 29.12.10 20:34
Я не знаю о чем думали разрабы vb6 в далеких годах, когда пилили язык.
з.ы. Пора ёлку ставить пожалуй
Номер ответа: 11
Автор ответа:
udn79
Вопросов: 2
Ответов: 95
Профиль | | #11
Добавлено: 04.02.11 02:38
1) динамический массив обьявляется как Redim mas(n) as Long
переменная n или число, параметры обязательные
2) у обьявления Dim mas() свои задачи, не нужно его использовать если не знаете назначения
3) Redim mas(n) даже при n=0 займет 4 байта, тогда как не осмысленное попытка проверить инициализацию Dim mas() куда больше
Единственая цель Dim tmp() // если не понятно из названия для хранения массивов ну и так по мелочи
Исключение байтового массива, от может работать и хранить строки
так что избегайте конструкцый Dim mas() если они вам не требуются
Описал возможности в кратце, только чтобы имели представления