Trois méthodes différentes d'utilisation d'une fonction avec ParamArray

Résolu
Duke49 Messages postés 552 Date d'inscription jeudi 12 octobre 2006 Statut Non membre Dernière intervention 24 janvier 2023 - 2 déc. 2010 à 20:43
Duke49 Messages postés 552 Date d'inscription jeudi 12 octobre 2006 Statut Non membre Dernière intervention 24 janvier 2023 - 3 déc. 2010 à 19:20
Voilà, ca semble plus ou moins une utilisation fixe, statique et dynamique.
Auriez-vous des commentaires a nous apporter ?

    Sub SetParamArray(ByVal pName As String, ByVal ParamArray pArray() As String)
        Dim I As Integer
        Debug.WriteLine(pArray.Length.ToString & " Paramètres pour " & pName & ":")
        For I = 0 To UBound(pArray)
            Debug.WriteLine("pArray(" & I & ") = " & pArray(I))
        Next I

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim A = "A"
        Dim B = "B"
        Dim Test2() As String = {A, B}

        Debug.Close()
        SetParamArray("Test 1", "A")
        SetParamArray("Test 2", Test2)
        SetParamArray("Test 3", A, B, "C")
    End Sub

8 réponses

Sehnsucht Messages postés 107 Date d'inscription samedi 25 novembre 2000 Statut Membre Dernière intervention 4 mai 2013
2 déc. 2010 à 21:35
Bonsoir,

Tout d'abord il n'y a que deux méthodes différentes d'appel.
Tes méthodes "Test 1" et "Test 3" sont identiques (syntaxiquement), elles passent un nombre de paramètres variables (resp. 1 et 3) qui sont des String (qu'ils soient issus de variables ou mis en dur ne change rien).

Ensuite, bien que la version "Test 2" soit absolument correcte, elle peut perdre l'intérêt du ParamArray ; en effet ce mot clef permet l'utilisation d'un sucre syntaxique, dans le sens où l'on n'est plus obligé de construire en amont le tableau de paramètres, c'est le compilateur qui s'en chargera. (Ainsi un tableau contenant "A" est créé lors de la compilation de "Test 1" et de même pour "Test 3" avec 3 valeurs)

En ce qui concerne UBound et LBound, dans le cas d'un tableau "classique" l'indice de départ sera 0 (donc pas besoin d'un "LBound") et l'indice de fin sera tableau.Length - 1.
Si jamais (chose plutôt rare sauf cas très spécifiques) tu devais avoir un tableau avec des "bornes" inhabituelles (notamment la borne inférieure) chose possible en utilisant la méthode statique CreateInstance de la classe Array, tu as toujours la possibilité d'utiliser les méthode GetLowerBound et GetUpperBound de ton tableau pour en obtenir ses "bornes" (voir documentation pour leurs signatures/utilisations)

Quant à ton dernier code, ce que tu as écrit c'est:
Récupère le nombre d'éléments de mon tableau (pArray.Length) => renvoie un Integer
Donne moi la valeur minimale pour le type Integer => renvoie donc -2 147 483 648
Converti ceci en Integer (ou Int32 c'est la même chose) donc au final revoie la même chose
Et enfin transforme ça en chaine de caractères soit "-2 147 483 648"

Cordialement !
3
Duke49 Messages postés 552 Date d'inscription jeudi 12 octobre 2006 Statut Non membre Dernière intervention 24 janvier 2023 4
2 déc. 2010 à 20:57
Première question, y'a t'il autre chose que UBound et LBound ?
0
Duke49 Messages postés 552 Date d'inscription jeudi 12 octobre 2006 Statut Non membre Dernière intervention 24 janvier 2023 4
2 déc. 2010 à 21:16
Il fonctionne pas mon LBound.Net !

Convert.ToInt32(pArray.Length.MinValue).ToString
0
Duke49 Messages postés 552 Date d'inscription jeudi 12 octobre 2006 Statut Non membre Dernière intervention 24 janvier 2023 4
2 déc. 2010 à 21:23
Sans savoir a quoi sa peut encore me servir, j'me rapproche de l'utilisation des Predicat avec le Array... J'ai cette impression là !

Y a l'air d'avoir des trucs super sympa a faire, exemple:
Array.TrueForAll


Sinon, je trouve pas LBound.Net et UBound.Net :(
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Duke49 Messages postés 552 Date d'inscription jeudi 12 octobre 2006 Statut Non membre Dernière intervention 24 janvier 2023 4
2 déc. 2010 à 22:08
D'accord ^^
Merci !

1) Quelle différence entre Lengh et Count ?
2) Quelle différence entre pArray() As String et Dim Test3 As Array ?
Voir mon exemple, le debug renvoi pArray(0) = System.String[] !?

    Sub SetParamArray(ByVal pName As String, ByVal ParamArray pArray() As String)
        Dim I As Integer
        Debug.WriteLine(pArray.Length.ToString & " Paramètres pour " & pName)
        
        For I = 0 To (pArray.Length - 1)
            Debug.WriteLine("pArray(" & I & ") = " & pArray(I))
        Next I

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim Test2() As String = {"A", "B"}
        Dim Test3 As Array = Array.CreateInstance(GetType(String), Test2.Length)

        Test3.SetValue("A", 0)
        Test3.SetValue("B", 1)


        SetParamArray("Test 1", "A")
        SetParamArray("Test 2", Test2)
        SetParamArray("Test 2", Test3.ToString)
    End Sub
0
Sehnsucht Messages postés 107 Date d'inscription samedi 25 novembre 2000 Statut Membre Dernière intervention 4 mai 2013
3 déc. 2010 à 10:39
En ce qui concerne Length (ne pas oublier le "t" ;) ) et Count ; je ne suis pas absolument certain, mais conceptuellement ils représentent la même chose le nombre d'éléments, la différence serait que Length s'applique plutôt aux tableaux et Count aux collections ; maintenant pourquoi deux noms différents là je sèche.

Ensuite la classe Array est la classe de base de tous les types tableaux, par conséquent un String() EST un Array mais le contraire n'est pas vrai
Pour s'en convaincre on peut vérifier que ceci renvoie True
TypeOf New String() {} Is Array


Par contre j'avais parlé de CreateInstance surtout à titre informatif, mais il faut vraiment vouloir se compliquer la vie pour l'utiliser de la manière dont tu l'as fait (même si je me doute que c'était pour tester) (son utilité réside, du moins celle que je lui trouve, lorsque l'on a besoin de créer un tableau qui démarrerait à un indice différent de 0 par exemple).

Enfin, lors de ton appel à la méthode avec Test3 tu lui passes la "représentation textuelle de l'objet" et par défaut (si le comportement n'est pas surchargé) cela renvoie le type "réel" de l'objet. Ton Array contient bien des String, il s'agit donc bien en réalité d'un tableau de String et donc Test3.ToString renvoie "System.String[]"

Cette chaîne est passé à la méthode, (qui crée un tableau d'un seul élément de manière implicite comme je l'évoquais dans mon post précédent) et tu parcours bien ce tableau dont l'indice 0 contient "System.String[]"

Pour obtenir le "vrai" parcours de ton tableau tu dois caster (convertir) ton Array en tableau String et en fait ce que tu aurais dû écrire était:
SetParamArray("Test 3", DirectCast(Test3, String()))


J'espère ne pas t'avoir trop embrouillé (moi et les explications ...)

Cordialement !
0
Duke49 Messages postés 552 Date d'inscription jeudi 12 octobre 2006 Statut Non membre Dernière intervention 24 janvier 2023 4
3 déc. 2010 à 19:16
J'ai bien compris compris, merci ^^

Je tente de faire une fonctione pour vérifier le type,
ca me laisse l'idée de pouvoir "l'auto caster" par la suite,
seulement, mon test de base ne fonctionne pas:
    Function CheckType(ByVal myObject As Object, ByVal myType As Type) As Boolean
        If TypeOf myObject Is curAny Then
            Return True
        Else
            MsgBox("L'objet n'est pas un type <" & curType.ToString & ">" & vbCrLf & "C'est un object de type: " & myObject.GetType.ToString, vbExclamation)
        End If
    End Function
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        MsgBox(CheckType(Me.PictureBox1, array)
        MsgBox(CheckType(Me.PictureBox1, PictureBox))
    End Sub
0
Duke49 Messages postés 552 Date d'inscription jeudi 12 octobre 2006 Statut Non membre Dernière intervention 24 janvier 2023 4
3 déc. 2010 à 19:20
Function CheckType(ByVal myObject As Object, ByVal myType As Type) As Boolean
If TypeOf myObject Is myType Then
Return True
Else
MsgBox("L'objet n'est pas un type <" & myType.ToString & ">" & vbCrLf & "C'est un object de type: " & myObject.GetType.ToString, vbExclamation)
Return False
End If
End Function
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim Test1() As String = {"A", "B"}
Dim Test2 As Array = Array.CreateInstance(GetType(String), Test2.Length)

MsgBox(CheckType(Test1, array)
MsgBox(CheckType(Test2, Array))
End Sub
0
Rejoignez-nous