Déclarations de procédure
Les déclarations de procédure et de fonction s'accordent sur les sous-programmes. Les deux paramètres sont transmis lorsqu'ils sont appelés. Les procédures ne produisent pas de résultat - c'est pourquoi les appels de procédure peuvent être utilisés comme de simples instructions. Les appels de fonction, par contre, se produisent dans des expressions - le résultat fourni par la fonction est utilisé pour d'autres calculs.
Les déclarations de procédure et de fonction se composent initialement de l'en-tête de procédure. Ceci spécifie le nombre et le type de paramètres, ainsi que (uniquement pour les fonctions) le type de résultat.
Ceci est suivi par les déclarations locales (même d'autres déclarations de procédure sont autorisées), et enfin la partie programme de la procédure.
Les exceptions sont les déclarations dans la partie interface des unités, les déclarations de méthode dans les objets et les déclarations forward - seule la tête de procédure est spécifiée ici.
Exemple:
Dans l'exemple, la procédure StrHex contient la fonction locale NibbleChar, qui à son tour contient la constante typée locale hexDig.procedure StrHex( x : Word; var res : string ); { Une fonction locale suit } function NibbleChar( n : Word ) : char; { Type de résultats : char } const hexDig : array [ 0 .. 15 ] of char = '0123456789ABCDEF'; begin nibbleChar := hexDig[ n and $F ]; end; begin { Démarrer les instructions de StrHex } res[0] := chr(4); { Longueur du résultat = 4 caractères } res[1] := NibbleChar( x shr 12 ); res[2] := NibbleChar( x shr 8 ); res[3] := NibbleChar( x shr 4 ); res[4] := NibbleChar( x ); end; { Fin de StrHex }
Dans la partie instruction des fonctions, il doit y avoir une affectation au nom de la fonction. Cette affectation spécifie la valeur renvoyée à la suite de l'appel. Notez que le nom de la fonction dans une expression (par exemple sur le côté droit d'une affectation) ne permet pas d'accéder à la valeur de retour, mais représente un appel récursif à la fonction elle-même.
Exemple:
function Fakultaet(n: longint): longint; begin if n = 0 then Fakultaet := 1 { Le résultat est 1 } else Fakultaet := n * Fakultaet(n-1); { appel récursif! } end;
Passages de paramètres et variables dans les fonctions et procédures en Pascal (Addentum du webmaster)
Lorsque le passage de paramètres est précédée de la mention var, les paramètres sont passés par pointeur (variable globale). Cela signifie que les variables modifiées au sein de la fonction ou procédure, le sont aussi au sein de la structure appelante (programme principal, fonction ou procédure).Lorsque le passage de paramètres n'est pas précédé de la mention var, le passage de paramètres se fait par valeurs (variable locale). Cela signifie que les modifications de paramètres au sein de la fonction ou procédure n'ont aucune incidence au sein des mêmes variables de la structure appelante.
Important : si au sein d'une fonction ou procédure, tout comme en Javascript, vous utilisez des paramètres non déclarées au sein de la fonction ou procédure (par passage de paramètres ou déclarées localement), celles ci se réfèrent aux variables de la structure appelante directement.
Exemple
Dans ce programme, les variables a, c de la procédure sont locales, alors que b (passage par pointeur) et d (non déclarée), sont globales, comme l'affichage des résultats le montre.Program proc; var a,b,c,d : byte; procedure sous (a : byte; var b:byte); var c:byte; begin a:=5; b:=6; c:=7; d:=8; writeln('Dans la procédure, ','a = ',a,'; ', 'b = ',b,'; ','c = ',c,'; ','d = ',d,'; '); end; begin a:=1; b:=2; c:=3; d:=4; writeln('Dans le programme principal, ','a = ',a,'; ', 'b = ',b,'; ','c = ',c,'; ','d = ',d,'; '); sous(a,b); writeln('Dans le programme principal, ','a = ',a,'; ', 'b = ',b,'; ','c = ',c,'; ','d = ',d,'; '); readln; end.