Formation ADA les procédures et fonctions, tutoriel & guide de travaux pratiques en pdf.
Procédures et fonctions
Forme générale
Alors qu’en C++, une procédure n’est rien d’autre qu’une fonction avec un type de retour void, en Ada, la notion de procédure est clairement séparée de la notion de fonction. Outre le fait qu’une procédure ne peut pas renvoyer de valeur, une fonction n’a pas le droit d’avoir de paramètre résultat, l’équivalent des paramètres références non constants en C++.
Il existe quatre types de modes de passages pour les paramètres en Ada : le mode in, qui est le mode par défaut quand rien n’est spécifié, le mode out qui modifie la valeur de la variable à l’extérieur de la procédure, le mode in out qui récupère la valeur en entrée et la modifie en sortie (l’équivalent de la référence non constante en C++), et le mode access qui demande un pointeur dont l’adresse ne sera pas modifié. Les fonctions ne peuvent avoir que des paramètres in ou access, alors qu’il n’y a aucune contrainte pour les paramètres d’une procédure. Voici tout de suite deux exemple de déclaration et de définition de sous programmes :
procedure Proc (Var1 : Integer; Var2 : out Integer; Var3 : in out Integer);
function Func (Var : Integer) return Integer;
procedure Proc (Var1 : Integer; Var2 : out Integer; Var3 : in out Integer) is begin Var2 := Func (Var1); Var3 := Var3 + 1; end Proc;
function Func (Var : Integer) return Integer is begin return Var + 1; end Func;
void Proc (int Var1, int & Var2, int & Var3);
int Func (int Var);
(int Var1, int & Var2, int & Var3) { Var2 = Func (Var1); Var3 = Var3 + 1; }
int Func (int Var) { return Var + 1; }
Il n’est pas absolument nécessaire de déclarer le profil d’un sous programme avant de l’implémenter, mais il s’agit de l’usage le plus fréquent, et les compilateurs qui incluent des options de style refusent en général une fonction non spécifiée. Typiquement, la déclaration de la fonction est dans le .ads (sauf pour les fonctions très spécifiques et très internes) et les définissions sont dans un .adb. Comme en C++, une fonction non déclarée ne peut pas être utilisée. Ada supporte également complètement les problèmes de récursivité. Un petit détail, à l’appel d’un sous programme sans paramètres, C++ demande quand même l’écriture du jeu de parenthèse ouvrantes / fermantes alors qu’il n’y a rien à écrire dans un code en Ada.
Ada ne donne pas de détails quand au mode de passage des paramètres, c’ est-à-dire que l’on ne doit pas savoir s’ils le sont par valeur ou par référence. Il peut être intéressent cependant d’avoir dans l’idée que la plupart des compilateurs implémentent le mode par référence.
Vous remarquerez que les paramètres sont séparés par des points virgules. C’est lié au fait que, en Ada, la virgule est utilisée pour lister des paramètres du même type. Les règles de déclaration sont en fait exactement les mêmes que pour les déclarations de variables, y compris pour les valeurs par défaut.
Surdéfinition
Ada permet bien évidemment de surdéfinir les sous programmes, avec plus de performance que le C++ : grâce au typage fort, il est en effet possible de surdéfinir des fonctions ayant le même profil pour les paramètres mais un type de retour différent. Ainsi il est parfaitement possible de discriminer l’appel de ces deux fonctions :
function Valeur (Str : String) return Integer; function Valeur (Str : String) return Float;
Ada propose également la classique surdéfinition des opérateurs, de la même façon qu’elle est permise en C++. L’unique particularité de cette surdéfinition est que l’affectation (:=) n’est pas considéré comme un opérateur à part entière, il n’est pas possible de le surdéfinir. Pour Ada, un opérateur est une fonction, qui a un nom compris entre deux guillemets. Par exemple :
function « = » (Left : Jour; Right : Integer) return Boolean;
bool operator « = » (Jour Left, int Right);