Astuces de recherche...
Home
- Accueil & nouveautés
- Les newsgroups VB
- Téléchargements
- L'équipe
- Nous contacter
- Liens
Rubriques
- Toutes les questions
- Affichage & graphismes
- Algorithmique
- API
- Base de registre
- Bases de données
- Contrôles
- Date & heure
- Déploiement
- Divers
- Erreurs & problèmes
- Fichiers & dossiers
- Généralités
- Impression
- Internet & mails
- Math
- Multimédia
- Réseaux
- Structures de données
- Texte & strings
- VB .Net
- VB Script
- VBA
- Windows

Question 86

Comment tester si un tableau dynamique est vide ?

Lors de l'emploi de la fonction UBound, si le tableau passé en paramètre est vide, Visual Basic génère une erreur. Il est donc parfois important de savoir si le tableau que l'on va traiter est vide.

Une des possibilités, pour ce faire, consiste justement à récupérer cette erreur :

Public Function IsArrayEmpty(ByVal V As Variant) As Boolean

    On Error Resume Next

    Err.Clear
    V = UBound(V)
    IsArrayEmpty = (Err.Number = 9)
    Err.Clear

End Function

Private Sub Form_Load()

    Dim tbl()

    MsgBox IsArrayEmpty(tbl)

    ReDim tbl(5)

    MsgBox IsArrayEmpty(tbl)

End Sub

Tout le monde ne s'accorde cependant pas sur l'importance d'une erreur, certains le voyant comme un simple nombre indiquant le résultat d'une opération, d'autres le voyant comme un manquement au niveau de tests préalables amenant à une situation indésirable. Une autre possibilité se base sur la fonction VarPtrArray de la runtime Visual Basic et de quelques manipulations mémoire. Il est à remarquer que l'utilisation de cette fonction n'est que peu documentée et non supportée par Microsoft. L'usage de cette méthode est donc à vos risques et périls.

Les déclarations suivantes sont requises :

Private Declare Function VarPtrArray _
  Lib "msvbvm60.dll" _
  Alias "VarPtr" _
  ( _
  ByRef ArrayVar() As Any _
  ) _
  As Long
Private Declare Sub CopyMemory _
  Lib "kernel32" _
  Alias "RtlMoveMemory" _
  ( _
  ByRef pDst As Any, _
  ByRef pSrc As Any, _
  ByVal ByteLen As Long _
  )

La fonction suivante détermine si un tableau est vide, à partir de son pointeur :

Private Function IsEmptyArray(ppsa As Long) As Boolean
    Dim psa As Long 'SAFEARRAY*

    ' Déférence le SAFEARRAY**
    CopyMemory psa, ByVal ppsa, LenB(psa)
    
    'Vérifie si une l'adresse est valide
    MyIsEmpty = psa = 0
End Function

A noter que la déclaration de la fonction MyIsEmpty ne dépend absolument pas du type de donnée du tableau, le pointeur étant indépendant du type de données. Ce pointeur sera déterminé à l'appel, comme le montre l'exemple suivant :

Private Sub Test()
    'Exemple d'utilisation
    Dim Array1(3) As Long
    Dim Array2() As Byte
    Dim Array3() As Double
    
    ReDim Array3(0 To 8)

    Debug.Print IsEmptyArray (VarPtrArray(Array1)) 'False
    Debug.Print IsEmptyArray (VarPtrArray(Array2)) 'True
    Debug.Print IsEmptyArray (VarPtrArray(Array3)) 'False
End Sub

Cette méthode ne fonctionne pas pour les tableaux de chaînes de caractères, pour lesquels il faudra utiliser VarPtrStringArray. En réalisant l'implémentation dans une DLL standard en C, il est néanmoins possible de supprimer les appels aux fonctions VarPtrArray et VarPtrStringArray, tout en profitant de la simplicité de manipulation des pointeurs inhérente au langage C.

Pour aller plus loin

Voir aussi :

Date de publication : 16 septembre 2002
Dernière modification : 11 septembre 2008
Rubriques : Divers
Mots-clés : tableau, dynamique, vide, empty, UBound, array