En Pascal standard, respectivement une procédure ou une fonction ne peuvent être exécutées que par un appel de procédure ou de fonction. En Turbo-Pascal, le concept de procédure et de fonction est étendu de manière à considérer les procédures et les fonctions comme des objets susceptibles d'être respectivement assignés à une variable ou passés comme paramètres - c'est le concept des types procéduraux [angl. procedural types].
La définition d'un tel type procédural spécifie les paramètres et, pour une fonction, le type résultat.
Figure 12.5 Définition d'un type procédural
Voici quelques exemples de types procéduraux:
TYPE Proc = PROCEDURE;
SwapProc = PROCEDURE ( VAR X, Y: Integer );
StringProc = PROCEDURE ( Str: String );
MathFunction = FUNCTION ( X: Real ): Real;
MaxFunction = FUNCTION ( A; B: Real; F: MathFunction ): Real;
Cependant, Turbo-Pascal ne permet pas la déclaration de fonctions qui retournent des valeurs de type procédural. La valeur résultat d'une fonction doit être une chaîne de caractères, un réel, un entier, un caractère, une valeur booléenne, un pointeur ou une constante d'un type énuméré, défini par l'utilisateur.
Le concept de type procédural une fois développé, il est possible de déclarer des variables d'un tel type. On les appelle variables procédurales [angl. procedural variables]. Avec les définitions de types précédentes nous pouvons déclarer:
VAR P: SwapProc;
F: MathFunction;
Considérons par exemple la procédure et la fonction suivante:
PROCEDURE Swap ( VAR A, B: Integer ); Far;
VAR Temp: Integer;
BEGIN
Temp := A;
A := B;
B := Temp
END; {-- Swap}
FUNCTION Tan ( Angle: Real ): Real; Far;
BEGIN
Tan := Sin( Angle )/Cos( Angle )
END; {-- Tan}
Avec les déclarations de variables précédentes nous pouvons écrire les affectations suivantes:
P := Swap;
F := Tan;
Par suite, les appels
P( I, J); Writeln( F( X ) );
sont équivalents à:
Swap( I, J ); Writeln( Tan( X ) );
Il est évident que les paramètres formels et effectifs doivent correspondre en nombre, en ordre et en types; de plus, les types résultat d'une fonction doivent être identiques.
Entre autres, une procédure ou fonction doit satisfaire les conditions suivantes, si on désire l'affecter à une variable procédurale:
la procédure ou fonction doit être déclarée en mode Far ou bien compilée avec la directive de compilation {$F+},
la procédure ou fonction ne doit pas être
(1) une procédure ou fonction standard, prédéfinie par le système de programmation,
(2) une procédure ou fonction imbriquée (c'est-à-dire déclarée dans le bloc d'une autre procédure ou fonction).
Si l'on désire affecter une procédure ou fonction standard à une variable procédurale, il faut écrire un "environnement" [angl. shell] autour d'elle. Voici un exemple:
TYPE IntProc = PROCEDURE ( N: Integer );
. . .
VAR IntP: IntProc;
. . .
PROCEDURE WriteInteger ( Number: Integer ); Far;
{ Shell }
BEGIN
Write( Number )
END; {-- WriteInteger}
. . .
BEGIN
. . .
IntP := WriteInteger;
. . .
END;
© Aflo Informatique , 2003-2004