Une déclaration de fonction est similaire à la déclaration d'une procédure mais elle spécifie le type de la valeur renvoyé. Une déclaration de fonction a la forme suivante :
function nomFonction(listeParamètres): typeRenvoyé; directives;
déclarationsLocales;
begin
instructions
end;
où nomFonction est un identificateur valide, typeRenvoyé est un nom de type, instructions la série des instructions exécutées quand la fonction est appelée. Les éléments (listeParamètres), directives; et déclarationsLocales; sont facultatifs.
Pour davantage d'informations sur listeParamètres, voir Paramètres.
Pour plus d'informations sur directives, voir Conventions d'appel, Déclaration forward et interface, Déclarations externes, Redéfinition de procédures et de fonctions et Ecriture de bibliothèques à chargement dynamique. Si vous spécifiez plusieurs directives, séparez-les par des points-virgules.
Pour plus d'informations sur les déclarationsLocales, qui déclarent des identificateurs locaux, voir Déclarations locales.
Le bloc instruction d'une fonction respecte les mêmes règles que celles qui s'appliquent aux procédures. A l'intérieur du bloc instruction, vous pouvez utiliser les variables et les autres identificateurs déclarés dans la partie déclarationsLocales de la fonction, les noms de paramètre de la liste de paramètres et les identificateurs dont la portée est dans la déclaration de la fonction. De plus, le nom de la fonction se comporte comme une variable spéciale contenant la valeur renvoyée par la fonction, de même que la variable prédéfinie Result.
Si la syntaxe étendue est activée ({$X+}), Result est déclarée implicitement dans chaque fonction. Vous ne devez donc pas la redéclarer.
Par exemple :
function WF: Integer;
begin
WF := 17;
end;
définit une fonction constante appelée WF qui n'attend pas de paramètre et renvoie toujours la valeur entière 17. Cette déclaration est équivalent à :
function WF: Integer;
begin
Result := 17;
end;
Voici un exemple de déclaration de fonction plus compliquée :
function Max(A: array of Real; N: Integer): Real;
var
X: Real;
I: Integer;
begin
X := A[0];
for I := 1 to N - 1 do
if X < A[I] then X := A[I];
Max := X;
end;
Dans le bloc instruction, vous pouvez affecter plusieurs fois une valeur à Result ou au nom de la fonction ; il faut simplement que le type de la valeur affectée corresponde au type renvoyé déclaré. Quand l'exécution de la fonction s'achève, la dernière valeur affectée à Result ou au nom de la fonction définit la valeur renvoyée par la fonction. Par exemple :
function Power(X: Real; Y: Integer): Real;
var
I: Integer;
begin
Result := 1.0;
I := Y;
while I > 0 do
begin
if Odd(I) then Result := Result * X;
I := I div 2;
X := Sqr(X);
end;
end;
Result et le nom de la fonction représentent toujours la même valeur. Ainsi, la fonction :
function MaFonction: Integer;
begin
MaFonction := 5;
Result := Result * 2;
MaFonction := Result + 1;
end;
renvoie la valeur 11. Cependant Result n'est pas complètement interchangeable avec le nom de la fonction. Quand le nom de la fonction apparaît à gauche d'une instruction d'affectation, le compilateur suppose qu'il est utilisé (comme Result) pour indiquer la valeur renvoyée. Par contre, quand le nom de la fonction apparaît n'importe où ailleurs dans le bloc instruction, le compilateur l'interprète comme un appel récursif de la fonction. Par contre, Result s'utilise comme une variable dans les opérations, les transtypages, les constructeurs d'ensemble, les indices et les appels à d'autres procédures.
Si la fonction s'achève sans qu'une valeur soit affectée à Result ou au nom de la fonction, la valeur renvoyée par la fonction est indéfinie.
Redéfinition de procédures et de fonctions
Partager