OVH Cloud OVH Cloud

Détecter le nombre de dimensions dans un Array

6 réponses
Avatar
Guy Lafrenière
Bonjour Collègues,

Je peux savoir qu'une donnée est de type Array avec le code qui suit:
IsArray = ( Right( TypeName(Data), 2 ) = "( )" )

Une fois que je sais que la donnée est de type Array, comment faire pour
savoir combien elle comporte de dimensions?

Merci pour votre aide!


Guy Lafrenière

6 réponses

Avatar
Gloops
Bonjour,

Pour le nombre de valeurs sur une dimension, on utilise LBound et UBound.

Par défaut LBound est 0 ou 1 selon la plate-forme.

On peut ainsi compléter l'exemple de la fonction TypeName fourni par MSDN :

Dim ArrayVar(1 to 5) As Integer
MyType = TypeName(ArrayVar) ' Renvoie "Integer()"

ainsi :
NbVal = UBound(ArrayVar) - LBound(ArrayVar) ' renvoie 5

Quant au nombre de dimensions, c'est plus délicat.

Toutefois si l'observation de la syntaxe de déclaration a permis de
déduire de la présence de parenthèses qu'on avait affaire à un tableau,
alors je pense qu'il suffit de compter les virgules entre les
parenthèses, et le nombre de dimensions sera d'un de plus que le nombre
de virgules. Je crois qu'on ne fera pas le décompte au niveau de la
déclaration, mais de la première initialisation.

Mais là, je sens que je m'aventure ...

C'est pour un outil d'analyse de code, j'imagine ?
En effet, en général, quand on conçoit un programme, on doit connaître
le nombre de dimensions d'un tableau avant d'avoir allumé la machine de
développement.

Je ne me rappelle pas avoir eu d'occasion de considérer comme orthodoxe
de changer le nombre de dimensions d'un tableau en cours d'exécution,
est-ce que j'ai manqué ou oublié quelque chose ?

________________________
Guy Lafrenière a écrit :
Bonjour Collègues,

Je peux savoir qu'une donnée est de type Array avec le code qui suit:
IsArray = ( Right( TypeName(Data), 2 ) = "( )" )

Une fois que je sais que la donnée est de type Array, comment faire pour
savoir combien elle comporte de dimensions?

Merci pour votre aide!


Guy Lafrenière




Avatar
Guy Lafrenière
Quand on cherche des bugs, il peut être utile d'anlayser les valeurs des
variables en traitement pour savoir si une mauvaise valeur serait à
l'origine du bug. Quand les données sont de type Array, Recordset,
Collection, Dictionary et qu'elles comportent de multiples valeurs (lignes,
colonnes, enregistrements, items), l'outil Debug.Print ou les autres outils
de débogage de VB sont particulièrement fastidieux pour arriver à voir
toutes les valeurs.

Je suis à créer un serveur dll qui affichera dans un grid chacune des
valeurs d'une variable passée en paramètre. Pour analyser le contenu de
cette variable, j'ai besoin de connaître le type de données, ce qui est
facile. Dans le cas d'un array, j'ai aussi besoin de connaître le nombre de
dimensions. Mon serveur agira différemment selon que le array est à 1 ou 2
dimensions. De plus, il ne traitera pas les arrays ayant plus de deux
dimensions, ce que je n'ai jamais utilisé de toute façon.

Voilà le but de ma question.

J'espère que ces précisions vous guideront.

Guy Lafrenière


"Gloops" a écrit dans le message de
news:%
Bonjour,

Pour le nombre de valeurs sur une dimension, on utilise LBound et UBound.

Par défaut LBound est 0 ou 1 selon la plate-forme.

On peut ainsi compléter l'exemple de la fonction TypeName fourni par MSDN


:

Dim ArrayVar(1 to 5) As Integer
MyType = TypeName(ArrayVar) ' Renvoie "Integer()"

ainsi :
NbVal = UBound(ArrayVar) - LBound(ArrayVar) ' renvoie 5

Quant au nombre de dimensions, c'est plus délicat.

Toutefois si l'observation de la syntaxe de déclaration a permis de
déduire de la présence de parenthèses qu'on avait affaire à un tableau,
alors je pense qu'il suffit de compter les virgules entre les
parenthèses, et le nombre de dimensions sera d'un de plus que le nombre
de virgules. Je crois qu'on ne fera pas le décompte au niveau de la
déclaration, mais de la première initialisation.

Mais là, je sens que je m'aventure ...

C'est pour un outil d'analyse de code, j'imagine ?
En effet, en général, quand on conçoit un programme, on doit connaître
le nombre de dimensions d'un tableau avant d'avoir allumé la machine de
développement.

Je ne me rappelle pas avoir eu d'occasion de considérer comme orthodoxe
de changer le nombre de dimensions d'un tableau en cours d'exécution,
est-ce que j'ai manqué ou oublié quelque chose ?

________________________
Guy Lafrenière a écrit :
> Bonjour Collègues,
>
> Je peux savoir qu'une donnée est de type Array avec le code qui suit:
> IsArray = ( Right( TypeName(Data), 2 ) = "( )" )
>
> Une fois que je sais que la donnée est de type Array, comment faire pour
> savoir combien elle comporte de dimensions?
>
> Merci pour votre aide!
>
>
> Guy Lafrenière
>
>


Avatar
Jean-Marc
"Guy Lafrenière" a écrit dans le message de
news:
Quand on cherche des bugs, il peut être utile d'anlayser les valeurs


des
variables en traitement pour savoir si une mauvaise valeur serait à
l'origine du bug. Quand les données sont de type Array, Recordset,
Collection, Dictionary et qu'elles comportent de multiples valeurs


(lignes,
colonnes, enregistrements, items), l'outil Debug.Print ou les autres


outils
de débogage de VB sont particulièrement fastidieux pour arriver à voir
toutes les valeurs.

Je suis à créer un serveur dll qui affichera dans un grid chacune des
valeurs d'une variable passée en paramètre. Pour analyser le contenu


de
cette variable, j'ai besoin de connaître le type de données, ce qui


est
facile. Dans le cas d'un array, j'ai aussi besoin de connaître le


nombre de
dimensions. Mon serveur agira différemment selon que le array est à 1


ou 2
dimensions. De plus, il ne traitera pas les arrays ayant plus de deux
dimensions, ce que je n'ai jamais utilisé de toute façon.

Voilà le but de ma question.

J'espère que ces précisions vous guideront.

Guy Lafrenière





Hello Guy,

une façon est de jouer avec Ubound qui admet comme 2eme
argument (optionel) la dimension dont on veut connaitre
la borne sup. Il sufffit d'appeler la fonction jusqu'à
déclencher une erreur, de la trapper et le tour est joué.

Voici une telle fonction:

Private Function GetVariableTypeAndDim(aVariable As Variant, aType As
Variant, aDim As Integer) As Boolean
Dim level As Integer
Dim dummy As Long

On Error GoTo GetVariableTypeAndDim_ERR

aType = TypeName(aVariable)
If InStr(aType, "(") > 0 Then
level = 1
While level < 100 ' 100, valeur débilement grande
dummy = UBound(aVariable, level)
level = level + 1
Wend
End If
suite_et_fin:

Exit Function

GetVariableTypeAndDim_ERR:
If Err.Number = 9 Then ' subscript out of range
level = level - 1
aDim = level
GetVariableTypeAndDim = True
Resume suite_et_fin
Else
GetVariableTypeAndDim = False
Resume suite_et_fin
End If
End Function


et voici un exemple d'appel

Private Sub Command1_Click()
Dim ArrayVar(1 To 5, 2 To 10, 4 To 9) As Integer
Dim mytype As Variant
Dim mydim As Integer
Dim bRet As Boolean

bRet = GetVariableTypeAndDim(ArrayVar, mytype, mydim)
MsgBox "la variabme ArrayVar est de type : " & _
mytype & " avec " & mydim & " dimensions"

End Sub

--
Jean-marc
Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
"There are only 10 kind of people
those who understand binary and those who don't."
mailto: remove '_no_spam_' ;
Avatar
Guy Lafrenière
Salut Jean-Marc,

Je n'ai pas encore essayé ton code mais à la lecture ça semble tout à fait
ce que voulais.

Merci!

Guy Lafrenière


Jean-Marc a écrit

Hello Guy,

une façon est de jouer avec Ubound qui admet comme 2eme
argument (optionel) la dimension dont on veut connaitre
la borne sup. Il sufffit d'appeler la fonction jusqu'à
déclencher une erreur, de la trapper et le tour est joué.

Voici une telle fonction:

Private Function GetVariableTypeAndDim(aVariable As Variant, aType As
Variant, aDim As Integer) As Boolean
Dim level As Integer
Dim dummy As Long

On Error GoTo GetVariableTypeAndDim_ERR

aType = TypeName(aVariable)
If InStr(aType, "(") > 0 Then
level = 1
While level < 100 ' 100, valeur débilement grande
dummy = UBound(aVariable, level)
level = level + 1
Wend
End If
suite_et_fin:

Exit Function

GetVariableTypeAndDim_ERR:
If Err.Number = 9 Then ' subscript out of range
level = level - 1
aDim = level
GetVariableTypeAndDim = True
Resume suite_et_fin
Else
GetVariableTypeAndDim = False
Resume suite_et_fin
End If
End Function


et voici un exemple d'appel

Private Sub Command1_Click()
Dim ArrayVar(1 To 5, 2 To 10, 4 To 9) As Integer
Dim mytype As Variant
Dim mydim As Integer
Dim bRet As Boolean

bRet = GetVariableTypeAndDim(ArrayVar, mytype, mydim)
MsgBox "la variabme ArrayVar est de type : " & _
mytype & " avec " & mydim & " dimensions"

End Sub

--
Jean-marc


Avatar
Guy Lafrenière
Resalue Jean-Marc,

Après avoir utilisé ton code avec une légère adaptation, c'est tout à fait
ce que je voulais.

Merci!

Guy Lafrenière


"Jean-Marc" a écrit
Hello Guy,

une façon est de jouer avec Ubound qui admet comme 2eme
argument (optionel) la dimension dont on veut connaitre
la borne sup. Il sufffit d'appeler la fonction jusqu'à
déclencher une erreur, de la trapper et le tour est joué.

Voici une telle fonction:

Private Function GetVariableTypeAndDim(aVariable As Variant, aType As
Variant, aDim As Integer) As Boolean
Dim level As Integer
Dim dummy As Long

On Error GoTo GetVariableTypeAndDim_ERR

aType = TypeName(aVariable)
If InStr(aType, "(") > 0 Then
level = 1
While level < 100 ' 100, valeur débilement grande
dummy = UBound(aVariable, level)
level = level + 1
Wend
End If
suite_et_fin:

Exit Function

GetVariableTypeAndDim_ERR:
If Err.Number = 9 Then ' subscript out of range
level = level - 1
aDim = level
GetVariableTypeAndDim = True
Resume suite_et_fin
Else
GetVariableTypeAndDim = False
Resume suite_et_fin
End If
End Function


et voici un exemple d'appel

Private Sub Command1_Click()
Dim ArrayVar(1 To 5, 2 To 10, 4 To 9) As Integer
Dim mytype As Variant
Dim mydim As Integer
Dim bRet As Boolean

bRet = GetVariableTypeAndDim(ArrayVar, mytype, mydim)
MsgBox "la variabme ArrayVar est de type : " & _
mytype & " avec " & mydim & " dimensions"

End Sub

--
Jean-marc
Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
"There are only 10 kind of people
those who understand binary and those who don't."
mailto: remove '_no_spam_' ;



Avatar
jean-marc
Merci du feedback :-)

--
Jean-marc


"Guy Lafrenière" wrote in message
news:
Resalue Jean-Marc,

Après avoir utilisé ton code avec une légère adaptation, c'est tout à fait
ce que je voulais.

Merci!

Guy Lafrenière


"Jean-Marc" a écrit
> Hello Guy,
>
> une façon est de jouer avec Ubound qui admet comme 2eme
> argument (optionel) la dimension dont on veut connaitre
> la borne sup. Il sufffit d'appeler la fonction jusqu'à
> déclencher une erreur, de la trapper et le tour est joué.
>
> Voici une telle fonction:
>
> Private Function GetVariableTypeAndDim(aVariable As Variant, aType As
> Variant, aDim As Integer) As Boolean
> Dim level As Integer
> Dim dummy As Long
>
> On Error GoTo GetVariableTypeAndDim_ERR
>
> aType = TypeName(aVariable)
> If InStr(aType, "(") > 0 Then
> level = 1
> While level < 100 ' 100, valeur débilement grande
> dummy = UBound(aVariable, level)
> level = level + 1
> Wend
> End If
> suite_et_fin:
>
> Exit Function
>
> GetVariableTypeAndDim_ERR:
> If Err.Number = 9 Then ' subscript out of range
> level = level - 1
> aDim = level
> GetVariableTypeAndDim = True
> Resume suite_et_fin
> Else
> GetVariableTypeAndDim = False
> Resume suite_et_fin
> End If
> End Function
>
>
> et voici un exemple d'appel
>
> Private Sub Command1_Click()
> Dim ArrayVar(1 To 5, 2 To 10, 4 To 9) As Integer
> Dim mytype As Variant
> Dim mydim As Integer
> Dim bRet As Boolean
>
> bRet = GetVariableTypeAndDim(ArrayVar, mytype, mydim)
> MsgBox "la variabme ArrayVar est de type : " & _
> mytype & " avec " & mydim & " dimensions"
>
> End Sub
>
> --
> Jean-marc
> Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
> "There are only 10 kind of people
> those who understand binary and those who don't."
> mailto: remove '_no_spam_' ;
>