• Aucun résultat trouvé

En dimension 2, un tableau dynamique sera déclaré de la façon suivante : 1 type **matrice;

2 matrice = new type*[L]; 3 for( int i=0; i<L; i++ ) 4 matrice[i] = new type[C];

et un tableau dynamique sera détruit de la façon suivante : 1 // A partir de l'exemple précédent

2 for( int i=0; i<L; i++ ) 3 delete[] matrice[i]; 4 delete[] matrice;

3.9 Fonctions

Une fonction est un sous-programme qui permet d’effectuer un ensemble d’instructions par simple appel à cette fonction. Les fonctions permettent d’exécuter dans plusieurs parties du programme une série d’instructions, ce qui permet de simplifier le code et d’obtenir une taille de code mini- male. Il est possible de passer des variables aux fonctions. Une fonction peut aussi retourner une valeur (au contraire des procédures, terminologie oblige...). Une fonction peut faire appel à une autre fonction, qui fait elle meme appel à une autre, etc. Une fonction peut aussi faire appel à elle-même, on parle alors de fonction récursive (il ne faut pas oublier de mettre une condition de sortie au risque sinon de ne pas pouvoir arrêter le programme).

3.9.1 Prototype d’une fonction

Comme les variables, avant d’être utilisée, une fonction doit être déclarée. Le prototype (ou dé- claration) d’une fonction correspond à cette déclaration. Il s’agit de la description de la fonction, c’est à dire donner son nom , indiquer le type de la valeur renvoyée et les types d’arguments. Cette fonction sera définie (les instructions qu’elle exécute) plus loin dans le programme. On place le prototype des fonctions en début de programme (généralement le plus tôt possible). Cette déclara- tion permet au compilateur de « vérifier » la validité de la fonction à chaque fois qu’il la rencontre dans le programme. Contrairement à la définition de la fonction, le prototype n’est pas suivi du corps de la fonction (contenant les instructions à exécuter), et ne comprend pas obligatoirement le nom des paramètres (seulement leur type). Une fonction est déclarée de la façon suivante :

1 type_retour NomFonction( [type Arg1, type Arg2,...] );

Le prototype est une instruction, il est donc suivi d’un point-virgule. Les entêtes (fichiers .h) contiennent les déclarations des fonctions. Par exemple#include <math.h> permet de déclarer toutes les fonctions de la libraire math.

3.9.2 Définition d’une fonction

La définition d’une fonction est l’écriture du programme exécuté par cette fonction. Une fonction est définie par l’ensemble nom de fonction, nombre d’arguments en entrée, type des arguments en entréeet liste d’instructions . La définition d’une fonction se fait selon la syntaxe suivante :

1 type_retour NomFonction( [type Arg1, type Arg2,...] )

2 {

3 liste d'instructions;

4 }

3 MÉMENTO DE SYNTAXE EN C++ 3.9 Fonctions

– type_retour représente le type de valeur que la fonction peut retourner (char, int, float...), il est obligatoire même si la fonction ne renvoie rien7;

– si la fonction ne renvoie aucune valeur, alorstype_retour est void ; – s’il n’y a pas d’arguments, les parenthèses doivent rester présentes.

De plus, le nom de la fonction suit les mêmes règles que les noms de variables : – le nom doit commencer par une lettre ;

– un nom de fonction peut comporter des lettres, des chiffres et le caractère_ (les espaces ne sont pas autorisés ) ;

– le nom de la fonction, comme celui des variables est sensible à la casse (différenciation entre les minuscules et majuscules)

3.9.3 Appel de fonction

Pour exécuter une fonction, il suffit de lui faire appel en écrivant son nom (en respectant la casse) suivie de parenthèses (éventuellement avec des arguments) :

1 NomFonction(); // ou

2 NomFonction1( Arg1, Arg2,... );

3.9.4 Passage d’arguments à une fonction

Il existe trois types de passage de paramètres à une fonction : le passage par valeur, par pointeur et par référence. Ces passages sont décrits ci-dessous.

Passage par valeur

Les arguments passés à la fonction sont copiés dans de nouvelles variables propres à la fonction. Les modifications des valeurs des arguments ne sont donc pas propagés au niveau de la portée de la fonction appelante. Ce type de passage de paramètre par valeur est aussi appelé passage par copie. Voici la syntaxe de passage par valeur :

– Déclaration :

1 type_retour NomFonction( [type Arg1, type Arg2,...] ); – Définition :

1 type_retour NomFonction( [type Arg1, type Arg2,...] )

2 {

3 // instructions de la fonction

4 // pouvant utiliser les valeurs des paramètres 5 // et déclarer d'autres variables

6 return variable_de_type_retour;

7 }

3.9 Fonctions 3 MÉMENTO DE SYNTAXE EN C++

void Affichage(int a, int b) {

cout<<"Valeur 1 = "<<a<<endl; cout<<"Valeur 2 = "<<b<<endl; }

int Somme(int a, int b) { int c = a + b; return c; } // suite du programme int main() { int nb1=2, nb2=3, nb3=4; int somme; Affichage( nb1, nb2); Affichage( Somme(nb1,nb2),3); somme = Somme( nb2, nb3); return 0; }

Passage par pointeur

Dans le cas où l’on souhaite modifier dans la fonction une variable passée en paramètre, il est nécessaire d’utiliser en C++ soit un passage par pointeur soit un passage par référence. Dans le cas du passage par pointeur, les variables passées en arguments de la fonction correspondent à des adresses de variables (pointeur ou&variable). Voici la syntaxe du passage par pointeur :

– Déclaration :

1 type_retour NomFonction( [type *Arg1, type *Arg2,...] );

– Définition :

1 type_retour NomFonction( [type *Arg1, type *Arg2,...] )

2 {

3 // instructions de la fonction

4 // les variables passées par pointeur s'utilisent 5 // comme les autres variables

6 return variable_de_type_retour;

7 }

3 MÉMENTO DE SYNTAXE EN C++ 3.9 Fonctions

void CopieTab(double *origine, double *copie, int taille) {

for (int i=0; i<taille, i++) copie[i] = origine[i]; }

void ModifTailleTab(double **tab, int taille) {

// suppression du tableau if ( *(tab) != NULL )

delete[] *(tab);

*(tab) = new double[taille]; // il faut définir **tab pour // que l'allocation dynamique // soit prise en compte au // niveau de la fonction // appelante } // suite du programme int main() { int dim=20; double tab1[20]; double tab2[20]; double *p = NULL; // Initialisation // de tab2 CopieTab(tab1,tab2,dim); // Allocation // dynamique de p ModifTailleTab(&p,dim); delete[] p; return 0; }

Passage par référence

Un paramètre passé par référence n’est pas copié en local pour la fonction : l’adresse mémoire du paramètre (sa référence) est passée à la fonction. Pour l’utilisateur de la fonction ainsi que pour le programmeur, ce processus est complétement transparent et est syntaxiquement identique au passage par valeur (à un& près...). Le passage par référence est utile pour :

– modifier et préserver les changements d’un paramètre passé en argument ; – gagner du temps en ne copiant pas le paramètre pour la fonction ;

– ne pas exécuter le constructeur de copie de l’objet passé. Voici la syntaxe du passage par référence :

– Déclaration :

1 type_retour NomFonction( [type &Arg1, type &Arg2,...] ); – Définition :

1 type_retour NomFonction( [type &Arg1, type &Arg2,...] )

2 {

3 // instructions de la fonction

4 // les variables passées par référence s'utilisent 5 // comme les autres variables

6 return variable_de_type_retour;

Documents relatifs