Site:  Cours VB.net  
1.12 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.