L'appel d'une fonction s'effectue toujours dans le contexte d'une expression. Cette expression sera soit une affectation, soit une comparaison.
Donc, on ne perdra pas de vue qu'un appel d'une fonction n'est pas une instruction à l'opposé d'un appel de procédure. Le mode d'évaluation des fonctions définies par l'utilisateur lui-même est identique à celui pour appeler les fonctions standard du langage utilisé.
La forme syntaxique générale de l'appel d'une fonction en Turbo-Pascal s'écrit:
Figure 12.4 Appel d'une fonction
A l'appel d'une fonction, les paramètres effectifs seront transmis suivant les modes de transmission des paramètres décrits dans le chapitre 11. Il est évident que les paramètres formels et effectifs doivent correspondre en nombre et en types.
Le mécanisme d'appel d'une fonction est similaire à celui de l'appel d'une procédure.
Exemple: Considérons la fonction Modulo définie par:
1 FUNCTION Modulo ( M, N: Integer ): Integer;
2 VAR Quotient, Reste: Integer;
3 BEGIN
4 Quotient := M DIV N;
5 Reste := M-Quotient*N;
6 Modulo := Reste
7 END; {-- Modulo}
Le type de la valeur retournée par la fonction, c'est-à-dire du reste de la division de M par N, est spécifié dans la ligne 1. L'instruction dans la ligne 6 affecte la valeur contenue dans la variable Reste à l'identificateur de fonction Modulo, ce qui a pour effet de définir la valeur retournée par la fonction. Le nom de fonction peut donc être considéré comme une "variable" dont la valeur représente la valeur de la fonction calculée. Evidemment on peut s'épargner les variables locales Quotient et Reste dans la fonction Modulo en écrivant:
1 FUNCTION Modulo ( M, N: Integer ): Integer;
2 BEGIN
3 Modulo := M-(M DIV N)*N;
4 END; {-- Modulo}
La fonction Modulo peut être appelée à partir d'une procédure, d'une autre fonction ou du programme principal qui lui fournira les valeurs de ses arguments et utilisera la valeur retournée par la fonction. Insistons encore une fois sur le fait, que le rôle d'une fonction est de fournir un résultat au (sous-) programme appelant à partir de données transmises sous forme de paramètres.
Par exemple, lors de l'affectation:
Z := A + Modulo( B-C, A );
l'évaluation du membre droit fait appel à l'évaluation de la fonction Modulo pour la valeur de M égale à la valeur de l'expression B-C et la valeur de N égale à celle de A. La valeur retournée par la fonction est ensuite utilisée pour déterminer la valeur de l'expression affectée à la variable Z.
Aussi une fonction peut-elle être définie à partir d'une autre fonction.
Exemple:
Supposons que la définition de la fonction Modulo fasse partie d'une bibliothèque de procédures et de fonctions externes PROCLIB.OBJ, c'est-à-dire que le code objet soit externe au fichier qui contient le (sous-) programme appelant. On écrira sans difficulté le programme suivant qui permet d'imprimer tous les nombres pairs de 1 à 1000:
PROGRAM EvenNumbers;
Uses Crt;
VAR I: Integer;
FUNCTION Modulo ( M, N: Integer ): Integer; External;
FUNCTION TestEven ( K: Integer ): Boolean;
{$L PROCLIB.OBJ}
BEGIN
TestEven := ( Modulo( K, 2 ) = 0 )
END; {-- TestEven}
BEGIN {EvenNumbers}
I := 1;
WHILE I<=1000 DO
BEGIN
IF TestEven( I ) THEN Writeln( I );
I := I+1
END {WHILE, I>1000}
END. {-- EvenNumbers}
La fonction TestEven, qui restitue un résultat du type booléen, fait explicitement appel à la fonction externe Modulo.
TERMES TECHNIQUES
appel d'une fonction
mécanisme d'appel d'une fonction
© Aflo Informatique , 2003-2004