Nous avons vu précédemment que les paramètres formels sont un moyen de communication entre sous-programme appelé et (sous-) programme appelant.
En langage Turbo-Pascal on distingue deux types de paramètres formels:
les paramètres (formels) par valeur [angl. value parameters],
les paramètres (formels) par référence ou par adresse ou par variable [angl. variable parameters].
Dans ces notes, nous allons discuter un troisième type non standard (!) en Turbo-Pascal:
les paramètres (formels) par nom.
Ces trois types de paramètres formels correspondent aux différents modes de communication entre sous-programme appelé et (sous-) programme appelant. Ces modes de communication, encore appelés mécanismes ou modes de transmission (passage) des paramètres sont:
la transmission par valeur [angl. call by value],
la transmission par référence ou par adresse [angl. call by reference],
la transmission par nom [angl. call by name].
Exemple: Considérons la procédure suivante:
PROCEDURE Value ( <mode de transmission> Z: Integer );
BEGIN
Writeln( Z );
Z := Z+9;
Writeln( Z )
END; {-- Value}
et supposons que cette procédure est appelée par le programme suivant:
PROGRAM ProcCall;
VAR X: Integer;
BEGIN
X := 3;
Writeln( X );
Value( X );
Writeln( X )
END. {-- ProcCall}
Suivant la manière dont on définit le mode de transmission des paramètres, l'effet-net de la procédure Value peut être interprété de différentes manières:
Le mode de transmission par valeur est le mode le plus simple qui ne permet le passage de valeurs que du (sous-) programme appelant vers le sous-programme appelé.
Figure 11.15 Mode de transmission par valeur
Dans le cas d'un paramètre passé par valeur, le paramètre effectif est traité comme une expression. Une conséquence de ce type de passage est que l'on ne peut pas modifier les valeurs des paramètres effectifs lors de l'exécution du sous-programme. Au moment de l'appel du sous-programme, les valeurs des paramètres effectifs sont affectées dans l'ordre de leur déclaration aux paramètres formels. Soit ici:
Figure 11.16 Communication entre ProcCall et Value
Au retour du sous-programme appelé, les paramètres effectifs gardent leur valeur originale dans le (sous-) programme appelant.
Autrement dit: les valeurs des paramètres effectifs sont copiées dans le sous-programme appelé, et seules les copies peuvent être modifiées; les paramètres effectifs gardent leur valeur originale dans le (sous-) programme appelant.
Le prototype de la procédure Value s'écrit:
PROCEDURE Value ( Z: Integer );
Lors du passage des paramètres par référence, les paramètres formels adressent les mêmes cellules-mémoire que les paramètres effectifs respectifs et ceci pendant tout le cours de l'exécution du programme.
Soit ici : Z adresse la même cellule-mémoire que X.
Donc, si un paramètre est passé par référence, c'est l'adresse du paramètre effectif qui est transmise au sous-programme appelé. On obtient après transmission du paramètre Z:
Figure 11.17 Transmission par référence
ce qui correspond à la réécriture suivante du bloc de la procédure:
Writeln( X );
X := X+9;
Writeln( X );
Dans le prototype de la procédure, la liste des paramètres formels doit être complétée par l'adjonction de l'attribut VAR qui spécifie le mode de transmission par référence. Soit ici:
PROCEDURE Value ( VAR Z: Integer );
Remarque importante:
Lors de la transmission des paramètres par référence, l'état des variables du (sous-) programme appelant peut être modifié par simple exécution d'un autre sous-programme. Il faut donc se rendre compte si c'est bien ça l'effet-net souhaité du traitement que l'on vient de réaliser, sinon ce mode de transmission constitue un effet "parasite", encore appelé effet de bord [angl. side-effect].
Lors du passage des paramètres par nom, spécifié par l'attribut NAME ajouté en préfixe à la liste des paramètres formels, les paramètres effectifs sont considérés comme des chaînes de caractères formant le texte de l'argument, soit ici 'Z'.
Chaque paramètre formel est substitué par le texte du paramètre effectif correspondant.
L'utilité de ce mode de transmission sera justifiée plus bas.
© Aflo Informatique , 2003-2004