|
Site |
Cours VB.net |
|
|
|
Procédures et paramètres |
|
|
On se souvient qu'en programmation fonctionnelle (ou procédurale) on découpe les problèmes en fonctions: les Sub et les Function.
Revenons sur les procédures et leurs paramètres.
Quand on appelle une procédure (un sous-programme, une routine), le logiciel ‘saute’ au sous-programme, il effectue celui-ci puis revient effectuer ce qui est sous l’appel.
En VB les procédures sont des Sub ou des Function.
On peut fournir aux procédures des paramètres qui sont envoyés à la fonction.
Exemple:
Function Carré ( v as Single) as Single
Return v*v
End Function
Cela crée une fonction qui se nomme 'Carré' , on peut lui envoyer un paramètre (elle accepte un Single)
Cette fonction retourne un Single (indiqué par As Single), le carré du paramètre fourni.
Pour l'utiliser :
Dim resultat As Single
resultat= Carré(2) 'résultat est alors égal à 4
On appelle la fonction carré avec le paramètre 2, elle retourne 4.
Les paramètres peuvent être des variables:
Dim resultat as Single
Dim valeur as Single=3
resultat= Carré(valeur)
Remarque: ici, on a un paramètre nommé 'valeur'; on appelle la fonction Carré avec ce paramètre. Dans la fonction Carré on retrouve ce paramètre; il se nomme 'v': Ce paramètre est passé à la fonction, mais il a un nom différent dans la fonction.
On conseille, quand
le nom d'une procédure est
composé de plusieurs mots, de mettre la première lettre de chaque mot en
majuscule.
Exemple:
MyCalcul()
Les parenthèses.
Rappel, même s'il n'y a pas de paramètre, mettre des () lors de l'appel de procédure.
MaRoutine()
Par Valeur, Par Référence.
Il y a 2 manières d’envoyer des paramètres :
Par valeur : (By Val)c’est la valeur (le contenu de la variable) qui est envoyée.
(La variable est copiée dans une autre partie de la mémoire pour être utilisée par la routine appelée.)
Par référence :(By Ref) c’est l’adresse (le lieu physique ou se trouve la variable) qui est envoyée. Si la Sub modifie la variable, cette modification sera visible dans la procédure appelante après le retour.
Exemple de procédures:
Sub MaProcedure (ByRef x as Long, ByVal y As Long)
End Sub
Si j'appelle cette procédure à partir d’une procédure nommé Main() :
Sub Main()
MaProcedure (A, B)
End sub
C'est l'adresse de A qui est envoyée et la valeur contenue dans la variable B. Elles se retrouvent dans les variables x et y de la procédure MaProcedure.
Si dans cette dernière je modifie x , A est modifié dans la Sub Main (puisque x et A pointe sur le même endroit). Si dans Maprocedure je modifie y , B n’est pas modifié.
Exemple permettant de bien différencier By Val et By Ref:
Exemple avec ByVal:
Sub MaProcedure
Dim A As Integer 'On créer une variable A
A=1 'On met 1 dans A
Call MaProcedure( A ) 'On appelle la procédure MaProcedure en envoyant le paramètre A
Label1.Text= A.ToString 'On affiche la valeur de A
End Sub
Sub MaProcedure ( ByVal Variable As Integer ) 'La procédure reçoit la valeur de A donc 1
' et la met dans 'Variable'
Variable=Variable+1 'Variable=2 mais A=1
End Sub
Après l'appel de la procédure A=1, Labe1 affiche '1'
Exemple avec ByRef:
Sub MaProcedure
Dim A As Integer 'On créer une variable A
A=1 'On met 1 dans A
Call MaProcedure( A ) 'On appelle la procédure MaProcedure en envoyant le paramètre A
Label1.Text= A.ToString 'On affiche la valeur de A
End Sub
Sub MaProcedure ( ByRef Variable As Integer ) 'La procédure reçoit l'adresse de A ; Variable et A ont donc même adresse
'Variable et A contiennent 1
Variable=Variable+1 'Variable=2 mais A=2 aussi
End Sub
Après l'appel de la procédure A=2, , Labe1 affiche '2'
Compris!!
![]()
L'avantage de passer un argument ByRef est que la procédure peut retourner une valeur au code qui a appelé la procédure en modifiant la valeur de la variable qui a été passée en argument.
L'avantage de passer un argument ByVal est que cette variable est 'protégée' dans le code qui a appelé la procédure; elle ne peut pas être modifiée par la procédure.
Par Défaut que se passe t-il?.
Si on n'indique pas By Val ou By Ref:
ATTENTION:
Pas défaut les paramètres sont transmis PAR VALEUR
Si je fais Sub MaProcedure( x as Long, y As Long), x et y sont transmis par valeur.
Pour la clarté du code et pour éviter toute ambiguïté, spécifier ByRef ou ByVal, c'est plus lisible , plus clair.
Taper Sub MaProcedure (ByRef x as Long, ByVal y As Long)
Plutôt que Sub MaProcedure ( x as Long, y As Long)
Optional
Un paramètre ou argument peut être Optional, c'est à dire facultatif.
Indique que cet argument n'est pas requis lorsque la procédure est appelée. Si ce mot clé est utilisé, tous les arguments suivants doivent aussi être facultatifs et déclarés à l'aide du mot clé Optional. Chaque déclaration d'argument facultative doit indiquer une valeur par défaut qui sera utilisée dans la routine s'il n'y a pas de paramètre.
Sub MaRoutine (Optional X As Integer=0)
Tableau de paramètres.
Il est possible d'envoyer un tableau comme paramètre.
Exemple:
Dim Reponses(10) As Integer
'Appel de la Sub
Affiche( Reponses())
La Sub 'Affiche' débute par:
Sub Affiche ( R() As Integer )
End Sub
ParamArray
Parfois il faut envoyer des paramètres de même type mais dont on ne connaît pas le nombre, dans ce cas on utilise ParamAray (Liste de paramètres):
Function Somme ( ByVal ParamArray Valeurs() as Integer) As Integer
Dim i as Integer
Dim Total as Integer
For i=0 to Valeurs.Length-1
Total += Valeurs(i)
Next i
Return Total
End Sub
Pour appeler cette fonction:
Dim LeTotal As Integer
LeTotal= Somme (2, 5, 6, 8 ,5)
A noter que le paramètre ParamArray doit être le dernier des paramètres, c'est obligatoirement un paramètre ByVal et comme on l'a dit, tous les paramètres sont de même type.
|
|
|
|
|