2010-01-21 21 views
10

Devo eseguire alcuni lavori ASP e ho scoperto che la lingua non fornisce un modo per rilevare array di lunghezza zero (beh, suppongo che tu possa rilevare l'eccezione che lancia quando provi usarli ...). Perché Split() restituisce un array vuoto se non esiste un modo corretto per gestirlo? O mi sta sfuggendo qualcosa?Matrici di lunghezza zero in VBScript

Ho inventato il seguente trucco per rilevare gli array vuoti, ma ci deve essere un modo più semplice. Cos'è questo? TIA

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

Forse si dovrebbe essere il controllo il vostro input prima di passarlo a Split() – Tester101

+0

VBScript e VBA sono abbastanza simili, in modo da vedere http:// StackOverflow.it/questions/206324/how-to-check-per-empty-array-in-vba-macro/206526 # 206526 – Fionnuala

risposta

4

Matrice vuoto creato utilizzando la funzione Array oppure restituito da altre funzioni VBScript intrinseche, come Split, ha un limite superiore di -1. Così si può verificare un array vuoto come questo:

Dim arr : arr = Array() 

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

Maggiori informazioni qui: Testing for Empty Arrays.

+4

Il tuo codice non è corretto perché UBound ha esito negativo su array vuoti. La pagina che hai collegato conferma il mio sospetto che l'unico modo è scoprire che viene lanciata un'eccezione (o dal mio "per ogni" hack). Questo è triste: -/ – angus

+2

@angus: è corretto perché il suo codice è simile a "risultati scuri: risultati = Matrice()" – Totonga

+0

d'accordo con angus. – Pixie

2

Se il metodo dovrebbe essere in grado di restituire un array vuoto il codice ha essere così

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 

Array() crea un Ubound = -1 matrice che non ha loop nella per ogni ciclo.

6

Per:

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) 

tornerà -1 per arr1, ma "errore di runtime VBScript: Indice fuori intervallo: 'UBound'" per arr2 e arr3.

Una funzione generica per verificare se un array è "Dimmer" o "Vuoto" dovrebbe anche (probabilmente) verificare se la variabile è effettivamente una matrice.

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) 

Per me, il 99% del tempo in cui sto controllando se un array è "quotato", è se ho bisogno di ottenere l'UBound dell'array e voglio evitare che un runtime errore nei casi dove l'array non è quotato. Così io di solito passare l'UBound come parametro del tipo:

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

Non so se questa pratica in realtà salva qualsiasi "Time", ma lo fa risparmiare 1 riga di codice con quasi ogni uso, ed è un un modo semplice per applicare la pratica del controllo degli errori.

Inoltre, includo per completezza, ma in pratica, la verifica di "UBound> = 0" in IsDimmedArray:

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

è in genere non è necessaria perché di solito sarà utilizzato in casi come :

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 

Quindi, in questo caso, lintUBound = -1 e il For ... Next verrà ignorato.

0

Penso che questa ist un buon modo per controllare un array in 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 
Problemi correlati