void main ( ) { appel(s) }
{ définition }
Déclaration ou prototype de la fonction
void NomProcédure(type paramètre1, type paramètre2)
void qui ne retourne rien
void main {
…
NomProcédure(argt1,
argt2);
…
}
void NomProcédure(type paramètre1,
type paramètre2) {
corps de la fonction :
variables-locales, instructions…
}
Déclaration ou prototype de la fonction
type retourné NomFonction(type paramètre1, type paramètre2)
void main {
…
NomFonction(argt1,
argt2);
…
return valeur-à-retourner
;
}
Rq : return (valeur-à-retourner)
; Û
return valeur-à-retourner ;
void NomFonction(type paramètre1,
type paramètre2) {
corps de la fonction :
variables-locales, instructions…
}
Avantages
· raisonnement plus général – décomposition en sous-problèmes
· trouver les bugs
· réutilisation
· programme plus lents
sauvegarde du contexte
* pile ¬ adresse de retour
* sauvegarde des valeurs des registres
puis restoration
mais actuellement machines très puissantes (plus visible)
inline fonction(type paramètres) ;
® optimisation car mécanisme d'appel différent
Chaque appel est remplacé par le corps de la fonction
Þ plus de sauvegarde ni de restoration du contexte ® + rapide
Pour fonctions très courtes (sinon trop de code)
Passage des arguments (prog.ppal)
· passage par valeur (défaut)
* paramètre (D)
* les paramètres sont des copies des arguments
* les modifier ne modifie pas les arguments
fonction(int x)
· passage par référence
* paramètre (D/R)
* on passe l'adresse de l'argument (pas de copie : + rapide)
fonction(int &x)
Tableaux
* Toujours par référence (sinon trop de place et long)
* Pas besoin de &
* pour passer un tableau en (D) : mettre const dans le prototype
type-renvoyé fonction(const type-du-tableau [] ) ;
Rq : const type-du-tableau [] OU type-du-tableau const []
Prototype
Û
type obligatoire
Le compilateur a besoin de la 2e dimension : le nb de colonnes, pour retrouver l'adresse de l'élément
Þ nb de colonnes obligatoire dans le prototype
* dans le prototype
* de droite à gauche ¬
fonction(int x, int y,
int z = valeur-par-défaut)
Attn : tableaux
* prototype : void procedure(const int [], int &) Û type
* appel : procedure(tableau, var); Û nom
* définition : void procedure(const int tableau[], int &var) Û nom et type