Как получить, если динамический массив имеет элементы внутри? - PullRequest
3 голосов
/ 29 ноября 2011

Если я объявлю массив динамического размера, как этот

Dim myArray()

Тогда как мне получить код, если этот массив пуст или содержит элементы?

Я пытался с IsArray(myArray) функцией, которая дает мне всегда True,

В противном случае, если я пытаюсь с UBound(myArray) функцией, я получаю ошибку.

Есть идеи?заранее спасибо,

Макс

Ответы [ 5 ]

2 голосов
/ 29 ноября 2011

После объявления массива его нужно инициализировать:

Dim myArray()
ReDim myArray(-1)

Тогда такой код всегда будет работать:

If UBound(myArray)<0 Then
    'array is empty....
Else  
    'array not empty....
End If

Редактировать: так как вы не можете инициализировать массив, вот более длинный способ проверить, пустой он или нет:

Dim x, myCount
myCount = 0
If IsArray(myArray) Then
    For Each x In myArray
        myCount = myCount + 1
    Next
End If
If myCount=0 Then
    'array is empty....
Else  
    'array not empty....
End If
1 голос
/ 19 марта 2013

Первые несколько заметок.

  1. Использование Dim A() не очень практично в VBScript, лучше использовать ReDim A(n).
  2. Например, ReDim A(-1) также пустой массив (нетэлементы) но инициализировано .

И как лучший способ кодировщиков говорить на примерах ...

Dim a(), b(0), c
c = Array(a, b)
ReDim d(-1)

WScript.Echo "Testing HasBound:"
WScript.Echo "a = " & HasBound(a) & ",", _
             "b = " & HasBound(b) & ",", _
             "c = " & HasBound(c) & ",", _
             "d = " & HasBound(d)
WScript.Echo "Testing HasItems:"
WScript.Echo "a = " & HasItems(a) & ",", _
             "b = " & HasItems(b) & ",", _
             "c = " & HasItems(c) & ",", _
             "d = " & HasItems(d)

'> Testing HasBound:
'> a = False, b = True, c = True, d = True
'> Testing HasItems:
'> a = False, b = True, c = True, d = False

Function HasBound(anyArray)
    On Error Resume Next
    HasBound = UBound(anyArray)
    HasBound = (0 = Err)
    On Error Goto 0
End Function

Function HasItems(anyArray)
    For Each HasItems In anyArray
        HasItems = 1
        Exit For
    Next
    HasItems = (HasItems > 0)
End Function

Как видите, 2 функции сразличное назначение.Разница видна в массиве d, который "имеет границу", но "имеет не элементы".

1 голос
/ 29 ноября 2011

Я нашел решение, я написал специальную функцию, чтобы проверить, является ли массив нулевым или нет;функция не проверяет наличие элементов внутри, но только если массив объявлен как динамический без измерений и элементов.

Dim dynamic_array()                         'array without a dimension
Dim empty_array(0)                          'array with a dimension but without an element inside
Dim full_array(0) : full_array(0) = "max"   'array with a dimension and with an element inside


Function IsNullArray(input_array)
    On Error Resume Next
    Dim is_null : is_null = UBound(input_array)
    If Err.Number = 0 Then
        is_null = False
    Else
        is_null = True
    End If
    IsNullArray = is_null
End Function


If IsNullArray(dynamic_array) Then

    Response.Write("<p>dynamic array not 'ReDimed'</p>")

End If

If Not IsNullArray(empty_array) Then

    Response.Write("<p>" & UBound(empty_array) & "</p>") 'return the last index  of the array

End If

If Not IsNullArray(full_array) Then

    Response.Write("<p>" & full_array(UBound(full_array)) & "</p>") 'return the value of the last element of the array

End If
0 голосов
/ 29 ноября 2011

Я всегда проверял UBound = 0, и первый элемент тоже пуст:

If UBound(myArray) = 0 Then
    if myArray(0) = "" then ''Depending on the type of the array
       ''array is empty....
    End If
End If
0 голосов
/ 29 ноября 2011

Единственное, о чем я могу думать сейчас:

On Error resume next
if UBound(myArray) < 0 then response.write "Empty array" end if

РЕДАКТИРОВАТЬ: Макс комментарий

...