Как определить: пуст массив или нет?

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

Как определить: пуст массив или нет?

Сообщение vbStr » 01.07.2005 (Пт) 17:15

Часто появляется такая проблема. Необходимо обработать массив (напр., его напечатать), но заполнен он или нет, неизвестно. Как выяснить: заполнен ли массив или нет? Функции типа Is*** не помогли.

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 01.07.2005 (Пт) 17:21

если он уже заполнялся или редимился, то только проверяя содержимое его эелементов, а если только объявлен как
Код: Выделить всё
Dim arr() as String


то тогда обращайся к любому элементу и по ошибке смотри.

а если уже был редим, но не заполнялся, то по содержимому
Код: Выделить всё
len(arr(0))>0
, например

vbStr
Новичок
Новичок
 
Сообщения: 44
Зарегистрирован: 04.04.2005 (Пн) 20:18

Сообщение vbStr » 01.07.2005 (Пт) 18:46

Konst_One писал(а):то тогда обращайся к любому элементу и по ошибке смотри

Konst_One, что значит "смотреть по ошибке"?
Если зашла речь об ошибках, то появился еще вопрос. :?: Часто в кодах встречаю выражение
Код: Выделить всё
On Error Resume Next
Что оно означает? "Пропусти ошибку, если она будет"? Так?

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 01.07.2005 (Пт) 20:09


tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 01.07.2005 (Пт) 22:05

Konst_One писал(а):если только объявлен как
Код: Выделить всё
Dim arr() as String


то тогда обращайся к любому элементу и по ошибке смотри.

Есть способ лучше: смотреть внутрь SAFEARRAY. Копирайты, кажется, у GSerg и Approximator.
Изображение

error41
Начинающий
Начинающий
 
Сообщения: 4
Зарегистрирован: 05.07.2005 (Вт) 22:21
Откуда: ЛЕНИНСК

Сообщение error41 » 05.07.2005 (Вт) 22:50

for a=0 to arr.ubound
if arr(a)=0 then b=b+1
c=c+1
next a

if b=c then "масив пустой"

Может не слишком оригинально, зато работает
Error 11 at pgm-ctr: 410

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 06.07.2005 (Ср) 3:07

Да ну?

И давно у массива есть свойство ubound?
А разницу между пустым и нулевым массивом - не?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 06.07.2005 (Ср) 8:16

GSerg писал(а):Да ну?

И давно у массива есть свойство ubound?

Года эдак с 2001, разве нет?
Изображение

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

Сообщение alibek » 06.07.2005 (Ср) 8:20

Да ну???
Помоему ты путаешь с коллекциями и массивами контролов.
Lasciate ogni speranza, voi ch'entrate.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Re: Как определить: пуст массив или нет?

Сообщение Andrey Fedorov » 06.07.2005 (Ср) 9:41

vbStr писал(а):Часто появляется такая проблема. Необходимо обработать массив (напр., его напечатать), но заполнен он или нет, неизвестно. Как выяснить: заполнен ли массив или нет? Функции типа Is*** не помогли.


GetArrayDimensions - возвращает размерность массива или 0 если массив не инициализирован.

UboundArray - возвращает кол-во элементов в указанной размерности массива или -1 если данная размерность не инициализирована.

То есть UboundArray неинициализированного массива вернет -1.
------------------------------------------
Код: Выделить всё
Public Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" _
    (Destination As Any, Source As Any, ByVal Length As Long)

Public Function UboundArray(ArrayName As Variant, Optional Dimension As Integer = 1) As Long
    If Dimension < 1 Or Dimension > GetArrayDimensions(ArrayName) Then
        UboundArray = -1
    Else
        UboundArray = UBound(ArrayName, Dimension)
    End If
End Function

Public Function GetArrayDimensions(arr As Variant) As Integer
    Dim a As Long

    CopyMemory a, ByVal VarPtr(arr) + 8, 4
    CopyMemory a, ByVal a, 4
    If a Then CopyMemory GetArrayDimensions, ByVal a, 2
End Function
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...


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

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

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

    TopList