2010-01-21 18 views
10

Tengo que hacer un trabajo ASP y descubrí que el lenguaje no proporciona una forma de detectar matrices de longitud cero (bueno, supongo que puedes detectar la excepción que lanzan cuando intentas para usarlos ...). ¿Por qué Split() devolvería una matriz vacía si no hay una forma sensata de manejarla? ¿O me estoy perdiendo algo?Arrays de longitud cero en VBScript

Inventé el siguiente hack para detectar matrices vacías, pero tiene que haber una manera más fácil. ¿Cuál es? TIA

function ArrayEmpty (a) 
    dim i, res 
    res = true 
    for each i in a 
     res = false 
     exit for 
    next 
    ArrayEmpty = res 
end function 
+1

Tal vez usted debe comprobar su entrada antes de pasarla a Split() – Tester101

+0

VBScript y VBA son bastante similares, por lo que ver http://desbordamiento de pila.com/questions/206324/how-to-check-for-empty-array-in-vba-macro/206526 # 206526 – Fionnuala

Respuesta

4

una matriz vacía creado usando la función Array o devuelto por otras funciones VBScript intrínsecas, como Split, tiene un límite superior de -1. Así se puede comprobar una matriz vacía como esto:

Dim arr : arr = Array() 

If UBound(arr) >= 0 Then 
    ' arr is non-empty 
Else 
    ' arr is empty 
End If 

Más información aquí: Testing for Empty Arrays.

+4

Su código es incorrecto porque UBound falla en las matrices vacías. La página que vinculó confirma mi sospecha de que la única forma es detectando que se lanza una excepción (o por mi "para cada" hack). Eso es triste: -/ – angus

+2

@angus: es correcto porque su código se ve como "resultados débiles: resultados = Matriz()" – Totonga

+0

de acuerdo con angus. – Pixie

2

Si el método debe ser capaz de devolver una matriz vacía el código tiene que ser así

Option Explicit 

dim result : result = mymethod 
if(NOT ubound(result) > 0) then MsgBox "Array Is Empty" 
dim elem : for each elem in result 
    MsgBox "Element" 
Next 

Function mymethod 
    dim results : results = Array() 
    mymethod = results 
End Function 

El Array() crea un Ubound = -1 matriz que tiene ningún bucle en la para cada bucle.

6

Por:

Dim arr1 : arr1 = Array() 
Dim arr2 
Dim arr3 : ReDim arr3(1) : Erase arr3 
WScript.Echo UBound(arr1) 
WScript.Echo UBound(arr2) 
WScript.Echo UBound(arr3) 

devolverá -1 para arr1, pero "error de ejecución de VBScript: Subíndice fuera del intervalo: 'UBound'" para arr2 y arr3.

Una función de propósito general para comprobar si una matriz está "atenuada" o "vacía" también debería (probablemente) probar si la variable es realmente una matriz.

Function IsDimmedArray(arrParam) 

Dim lintUBound : lintUBound = 0 
Dim llngError : llngError = 0 

    IsDimmedArray = False 
    If Not IsArray(arrParam) Then : Exit Function 

'' Test the bounds 
    On Error Resume Next 

     lintUBound = UBound(arrParam) 
     llngError = Err.Number 
     If (llngError <> 0) Then : Err.Clear 

    On Error Goto 0 
    If (llngError = 0) And (lintUBound >= 0) Then : IsDimmedArray = True 

End Function     ' IsDimmedArray(arrParam) 

Para mí, el 99% de las veces cuando estoy comprobando si una matriz es "acotado", es decir si necesito para obtener el UBound de la matriz y quiero evitar un tiempo de ejecución de errores en los casos donde la matriz no está dimensionada. Así que por lo general pasar el UBound como un parámetro como:

Function IsDimmedArray(arrParam, intUBoundParam) 
    intUBoundParam = 0 
    ... 

No sé si esta práctica ahorra realmente ninguna "Time", pero lo hace ahorrar 1 línea de código con casi cada uso, y es una forma fácil de aplicar la práctica de la comprobación de errores.

Además, lo incluyo por la totalidad, pero en la práctica, la comprobación de "UBound> = 0" en IsDimmedArray:

If (llngError = 0) And (lintUBound >= 0) Then : IsDimmedArray = True 

es por lo general no es necesario porque por lo general se va a utilizar en casos como :

Dim arrX 
Dim lintUBound 
Dim intNdx 

arrX = Array() 
lintUBound = UBound(arrX) 
WScript.Echo "arrX is an array with UBound=" & lintUBound 

For intNdx = 0 to lintUBound 
    WScript.Echo "This will not print: " & intNdx 
Next 

Por lo tanto, en este caso, lintUBound = -1 y el Para ... a continuación se saltará.

0

Creo que esto ist una buena manera de comprobar una matriz en VBS

Dim myArray 
myArray = Array() 
sTest = IsArrayEmpty(myArray) 
Msgbox (sTest) ' True 
Function IsArrayEmpty(myArray) 
    iRet = True 

    If IsArray(myArray) Then 
     i = 0 
     For Each e In myArray 
      If Not IsEmpty(e) And Len(e)>0 Then 
       i = i +1 
      End If 
     Next 
     If i>0 Then 
      iRet = False 
     End If 
    End If 
    wIsArrayEmpty = iRet 
End Function