Previous Page Next Page

12.6 Le concept de type procédural

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.

Undisplayed Graphic

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;

Previous Page Next Page


© Aflo Informatique , 2003-2004