2010-01-21 4 views
10

Je dois faire un travail ASP et j'ai découvert que le langage ne permet pas de détecter les tableaux de longueur nulle (enfin, je suppose que vous pouvez détecter l'exception qu'ils lancent quand vous essayez pour les utiliser ...). Pourquoi Split() renverrait-il un tableau vide s'il n'y avait aucune façon de le gérer? Ou est-ce que je manque quelque chose?Les tableaux de longueur nulle dans VBScript

J'ai concocté le hack suivant pour détecter des tableaux vides, mais il doit y avoir un moyen plus facile. Lequel est-ce? TIA

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

Peut-être que vous devriez vérifier votre entrée avant de la transmettre à Split() – Tester101

+0

VBScript et VBA sont assez similaires, donc voir http:// stackoverflow.com/questions/206324/how-to-check-for-empty-array-in-vba-macro/206526 # 206526 – Fionnuala

Répondre

4

Un tableau vide créé à l'aide de la fonction Array ou renvoyée par les autres fonctions de VBScript intrinsèques, tels que Split, possède une limite supérieure de -1. Vous pouvez donc tester un tableau vide comme ceci:

Dim arr : arr = Array() 

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

Plus d'infos ici: Testing for Empty Arrays.

+4

Votre code est incorrect car UBound échoue sur les baies vides. La page que vous avez liée confirme ma suspicion que le seul moyen est de détecter qu'une exception est levée (ou par mon "pour chaque" hack). C'est triste: -/ – angus

+2

@angus: il est correct parce que son code ressemble à "résultats faibles: results = Array()" – Totonga

+0

en accord avec angus. – Pixie

2

Si votre méthode devrait être en mesure de retourner un tableau vide votre code doit être comme celui-ci

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() crée un Ubound = -1 tableau qui n'a pas de boucle dans la boucle pour chaque.

6

Pour:

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) 

retournera -1 pour arr1, mais "erreur d'exécution VBScript: Subscript hors de portée:« UBound" pour arr2 et arr3.

Une fonction d'usage général permettant de tester si un tableau est "Affiné" ou "Vide" devrait également (probablement) tester si la variable est réellement un tableau.

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) 

Pour moi, 99% du temps quand je vérifie si un tableau est « Dimensionné », est si je dois obtenir le UBound du tableau et je veux éviter que l'exécution d'erreur dans les cas où le tableau n'est pas dimensionné. Je vais donc passer généralement le UBound comme paramètre comme:

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

Je ne sais pas si cette pratique sauve en fait une « Time », mais il fait économiser 1 ligne de code avec presque chaque utilisation, et est un moyen facile d'imposer la pratique de la vérification des erreurs.

Aussi, je l'inclure pour être complet, mais dans la pratique, la vérification des « UBound> = 0 » à IsDimmedArray:

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

est généralement pas nécessaire parce que généralement il sera utilisé dans des cas comme :

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 

Ainsi, dans ce cas, lintUBound = -1 et For ... Next sera sautée.

0

Je pense que ce ist une bonne façon de vérifier un tableau dans 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 
Questions connexes