Trois méthodes différentes d'utilisation d'une fonction avec ParamArray [Résolu]

Duke49 553 Messages postés jeudi 12 octobre 2006Date d'inscription 6 juin 2015 Dernière intervention - 2 déc. 2010 à 20:43 - Dernière réponse : Duke49 553 Messages postés jeudi 12 octobre 2006Date d'inscription 6 juin 2015 Dernière intervention
- 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
Afficher la suite 

Votre réponse

8 réponses

Meilleure réponse
Sehnsucht 107 Messages postés samedi 25 novembre 2000Date d'inscription 4 mai 2013 Dernière intervention - 2 déc. 2010 à 21:35
3
Merci
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 !

Merci Sehnsucht 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 92 internautes ce mois-ci

Commenter la réponse de Sehnsucht
Duke49 553 Messages postés jeudi 12 octobre 2006Date d'inscription 6 juin 2015 Dernière intervention - 2 déc. 2010 à 20:57
0
Merci
Première question, y'a t'il autre chose que UBound et LBound ?
Commenter la réponse de Duke49
Duke49 553 Messages postés jeudi 12 octobre 2006Date d'inscription 6 juin 2015 Dernière intervention - 2 déc. 2010 à 21:16
0
Merci
Il fonctionne pas mon LBound.Net !

Convert.ToInt32(pArray.Length.MinValue).ToString
Commenter la réponse de Duke49
Duke49 553 Messages postés jeudi 12 octobre 2006Date d'inscription 6 juin 2015 Dernière intervention - 2 déc. 2010 à 21:23
0
Merci
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 :(
Commenter la réponse de Duke49
Duke49 553 Messages postés jeudi 12 octobre 2006Date d'inscription 6 juin 2015 Dernière intervention - 2 déc. 2010 à 22:08
0
Merci
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
Commenter la réponse de Duke49
Sehnsucht 107 Messages postés samedi 25 novembre 2000Date d'inscription 4 mai 2013 Dernière intervention - 3 déc. 2010 à 10:39
0
Merci
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 !
Commenter la réponse de Sehnsucht
Duke49 553 Messages postés jeudi 12 octobre 2006Date d'inscription 6 juin 2015 Dernière intervention - 3 déc. 2010 à 19:16
0
Merci
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
Commenter la réponse de Duke49
Duke49 553 Messages postés jeudi 12 octobre 2006Date d'inscription 6 juin 2015 Dernière intervention - 3 déc. 2010 à 19:20
0
Merci
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
Commenter la réponse de Duke49

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.