|
|
|||||
|
eVB permet, comme beaucoup de langages, de créer des fonctions ou des procédures qui acceptent des paramètres. Cette fonctionnalité permet de créer des programmes plus lisibles et plus structurés. Avec eVB, il est possible de passer des paramètres avec le mot clé "Byval" ou avec le mot clé "ByRef". Nous allons apprendre dans cet article quelle est la différence entre ces 2 mots clés et donc à quoi ils servent.
Pour créer une fonction ou une procédure paramétrée sous eVB il suffit d'énumérer les paramètres dans la partie déclaration de la procédure ou fonction. Ainsi, si l'on veut créer la fonction 'Somme' qui retourne la somme de deux réels simple (Single) on peut écrire : Function Somme(n1 As Single, n2 As Single) As Single
Somme = n1 + n2
End Function
et l'appel à cette fonction sera par exemple : Dim s As Single n1 et n2 sont les paramètres de la fonction "Somme", ce sont tous deux des variables de type Single, et la fonction nous retourne un Single aussi, en somme, tout va bien. Mais je peux écrire aussi : Function Somme(Byval n1 As Single, Byval n2 As Single) As Single Somme = n1 + n2 End Function Je viens de rajouter
le mot clé Byval avant n1 et n2... Il faut savoir qu'il y a pour eVB 2 moyens pour passer un paramètre à une fonction ou une méthode. Le passage par référence, et le passage par valeur...
Le passage par référence est le mode par défaut de eVB. Si vous ne précisez rien, eVB considère que vous effectuez un passage par référence. Le mot clé eVB pour indiquer explicitement un passage par référence est "Byref" : Function Somme(ByRef n1 As Single, Byref n2 As Single) As Single Avec ce mode de passage, c'est uniquement les adresses mémoire des paramètres "n1" et "n2" qui sont passées à la fonction "Somme". Ceci sous entend que si dans le code de "Somme" vous modifiez la valeur de "n1" ou de "n2", vous modifiez aussi la valeur des variables qui ont servies à passer les paramètres : Function Somme(Byref n1 As Single, Byref n2 As Single) As Single Somme = n1 + n2 n1 = n2 / 2 End Function Si j'utilise cette fonction en passant en paramètre des variables : Dim s As Single Au retour de la fonction "Somme", "s" sera égale à 110 (10+100), p1 à 50 (et oui !!), et p2 sera toujours égale à 100. Comme dans la fonction "Somme" j'ai modifié la valeur de "n1", et bien "p1" qui a servi à passer la valeur à "n1" est modifiée aussi. En fait, avec le passage par référence, "p1" et "n1" font référence à la même zone de stockage de variable. Ce système peut être très puissant si par exemple nous devons récupérer plusieurs valeurs en retour. En effet, une fonction ne peut retourner qu'une seule valeur, alors qu'avec le passage de paramètre par référence, on peut en retourner à volonté : Sub DivMul2(Byref Valeur As Single, Byref Div As Single, Byref Mul As Single)
Div = Valeur/2
Mul = Valeur*2
End Sub
La procédure "DivMul2" retourne par l'intermédaire de ces paramètres "Div" et "Mul" le résultat de la division par 2 et le résultat de la multiplication par 2 du paramètre "Valeur" : Dim ResultDiv As Single Call DivMul2(100, ResultDiv, ResultMul) Au retour de "DivMul2", "ResultDiv" est égale à 50 et "ResultMul" à 200, magique !
Avec le mot clé "Byval", eVB effectue une copie de la valeur du paramètre passé. Ainsi, il n'y a plus aucun lien entre la variable qui a servi à passer le paramètre et le paramètre lui même. Si nous reprenons notre exemple de tout à l'heure avec "Byval" à la place de "ByRef" : Function Somme(Byval n1 As Single, Byval n2 As Single) As Single Somme = n1 + n2 n1 = n2 / 2 End Function Si j'utilise cette fonction en passant en paramètre des variables : Dim s As Single Au retour de la fonction "Somme", "s" sera égale à 110 (10+100), p1 toujours à 10, et p2 sera toujours égale à 100. Le fait de modifier dans "Somme" la valeur du paramètre "n1" n'a eu aucune répercution sur "p1" car eVB à effectué une copie intermédiaire qui en quelque sorte protège "p1" des manipulations de "n1". Cette méthode de passage est un peu plus lente que la méthode par référence, car si vous passez des paramètres volumineux (une grosse chaine de caractères par exemple) eVB doit en effectuer une copie, par contre cette méthode est plus sécurisée.
La conclusion de cet article
est simple, utilisez Byval ou Byref à votre guise en ayant toujours
en tête ce que permet l'une (avec des bêtises parfois à
la clé) et ce que bloque l'autre (mais avec sécurité).
|
|||||
|
|
|||||
|
Copyright 2001-2004 - Tous droits réservés
|
|||||
|
iPAQ
est un produit de COMPAQ.
|