Tableau initialise

Soyez le premier à donner votre avis sur cette source.

Snippet vu 4 867 fois - Téléchargée 16 fois

Contenu du snippet

Je cherche une fonction me permettant de savoir si mes tableaux dynamiques [ ex: dim Tableau() as string ] sont initialisées et possèdent des limites quand ils arrivent dans mes procedures ou fonctions.
Je ne l'ai pas trouvé sur le site, et je vous poste donc ce code, trouvé sur internet, qui indique si un tableau possède des limites et le nombre de dimensions [ ex Redim Tableau (1 to 5, 1 to 7): 2 dimensions

Source / Exemple :


'Rappels de Base pour gérer les tableaux
'=> redim preserve : IL est à noter que pour un tableau 
'   de plusieurs variables, seul la dernière peut être 
'   redimensionnée.
'=> IsMissing ne marche que si la variable n'est pas déclaré 
'   (ex: as long) dans Optional

'Function memoire pour tester un tableau ; en tête de module
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpDest As Any, lpSource As Any, ByVal cBytes As Long)
Private Const Vt_byref = &H4000& ' if array type is reference to another variable

' Tester si un tableau est initialisé ou non 
' et retourne le nombre de dimensions
Public Function HasBounds(TheArray, Optional ByVal Dimension As Long = 1) As Boolean
Dim Lp As Long, LL As Long, Low As Long, elm As Long, Vtype As Integer, CDims As Integer
' LP et LL=Pointer Low=Lbound elm=nb d'element in array, vtype =vartype cdims=nb of dimension
If Not (IsArray(TheArray)) Then
    HasBounds = False: Exit Function
End If
CopyMemory Vtype, TheArray, 2 'get pointer to the array type
CopyMemory Lp, ByVal VarPtr(TheArray) + 8, 4 'get pointer to array data
If (Vtype And Vt_byref) <> 0 Then
    CopyMemory Lp, ByVal Lp, 4
End If
If Lp = 0 Then
    HasBounds = False: Exit Function
End If
CopyMemory CDims, ByVal Lp, 2 'get number of dimension
If CDims > 0 Then
    HasBounds = True
    Dimension = CDims - Dimension
    CopyMemory elm, ByVal Lp + 16 + 8 * Dimension, 4
    CopyMemory Low, ByVal Lp + 20 + 8 * Dimension, 4
    a_voir = Low + elm - 1 'get ubound
Else
    HasBounds = False
End If
End Function

 ' ######## FIN #######

Conclusion :


Ce code me permet d'anticiper les erreurs que peuvent générer l'appel au procedures lbound et ubound quand un tableau dynamique n'a pas recu l'instruction redim.
On peut surement l'améliorer.

A voir également

Ajouter un commentaire

Commentaires

Messages postés
416
Date d'inscription
vendredi 22 février 2008
Statut
Membre
Dernière intervention
7 janvier 2018
1
merci l'ami, je vais regarder cette procedure
Messages postés
3
Date d'inscription
dimanche 25 janvier 2004
Statut
Membre
Dernière intervention
26 novembre 2008

une function api existe pour cela:

Private Declare Function SafeArrayGetDim Lib "oleaut32.dll" (ByRef saArray() As Any) As Long

If SafeArrayGetDim(monTableau) > 0 Then
'Le tableau est deja dimensionné
else
'Redim pas effectué
end if

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.