Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Динамические массивы  (Прочитано 9941 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
SAA
Гость
« : 20-09-2003 10:03 » 

Как узнать инициализирован массив или нет. Пример

Код:
Sub TestArray) ByVal a As Variant :
    Dim i&, qty&
    If Right$) TypeName)a:, 1 : <> ":" Then Debug.Print "This isn't array!"
    ' здесь должна быть проверка инициализирован ли массив
    qty = UBound) a :
    For i = 0 To qty
        Debug.Print a) i :
    Next
End Sub


Можно конечно было бы задействовать объект Err, но не нравиться мне программировть через одно место.
Записан
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #1 : 20-09-2003 10:08 » 

If Typename(a)<>"Nothing"

или как?
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
SAA
Гость
« Ответ #2 : 20-09-2003 11:34 » 

Цитата
If Typename(a)<>"Nothing"

Нет так можно было бы проверять переменные, содержащие объектные ссылки, хотя я проверяю их с помощью след. коснтрукции
If obj Is Nothing
а с динамическими массивами сложнее.
Dim ai%()
Debug.Print TypeName(ai)
получиться "Integer()", а вот узнать инициализирован ли этот массив как? Неужели придется ковырять в MSDN'е тип VARIANT и Safe Array?

Цитата
или как?

Я первый спросил  Жжешь  Показываю язык
Записан
boki
Гость
« Ответ #3 : 20-09-2003 18:19 » 

Все очень просто массивы енто круто
Visual Basic предоставляет довольно мощные средства для работы с такими массивами. Опеределяется такой массив следующим образом:
Dim myArray () As Byte
В отличие от массивов статичных размеров, когда обращаться к элементам можно сразу после его объявления, к элементам динамического массива сразу обращаться нельзя, т.к. они ещё не инициализированы. Для начала нужно указать его новую размерность. Для это в VB есть оператор ReDim. Работает он следующим образом:
ReDim myArray (4)
Теперь массив myArray имеет одну размерность с индексами от 0 до 4 (т.е. всего 5 элементов). Теперь к такому массиву можно обращаться точно так же, как и к статичному. Если в дальнейшем возникнет необходимость снова изменить размерность массива, можно ещё раз использовать ReDim.
Но! Здесь есть подводный камень! Давайте рассмотрим маленький примерчик:
Dim myLong As Long
Dim myArray() As Long ' объявляем массив
ReDim myArray (2) ' одна размерность [0,1,2]
myArray (1) = 234 ' присваиваем второму элементу чило 234
myLong = myArray (1) ' сохраняем его в переменной myLong
ReDim myArray (3) ' снова меняем размерность-теперь [0,1,2,3]
myLong = myArray (1) ' снова пытаемся сохранить второй элемент
На последней строке, переменной myLong присвоится 0 вместо 234! Это происходит потому, что оператор ReDim заново инициализирует (сбрасывает) все элементы массива к значению по умолчанию (как помните, для чисел - это 0, для строк ""). Но как же быть, если мы хотим изменить размеры массива, сохранив все старые элементы? Для этого нужно после оператора ReDim поставить слово Preserve. Примерно так:
ReDim Preserve myArray (3) ' сохраняем старые элементы
myLong = myArray (1) ' всё в порядке
Теперь всё в порядке.
 Улыбаюсь
Записан
wamark
Гость
« Ответ #4 : 24-05-2006 10:14 » new

Может объявить массив как Arr(1 to X)
Тогда если он не инициализирован,функция UBound(arr) вернёт 0
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines