Exood4 Studio - Video Game Development, Toulouse (France)
Exood4 Studios Exood4 Tutorials

   
L a n g a g e   C

L e s   f o n c t i o n s






L'en tête


 L'en-tête comporte le type de la valeur de retour, l'identificateur de la fonction et la liste des paramètres formels entre parenthèses. Les parenthèses sont obligatoires même si la liste est vide. Les paramètres sont séparés par une virgule et il faut préciser pour chaque paramètre son type et son nom :

int f (float x, float y);

/* f est une fonction à 2 paramètres réels x et y et retourne un entier */


Le corps de la fonction


Le corps de la fonction est une instruction composée, c'est à dire un bloc composé de déclarations, de définitions et d'instructions.


La valeur de retour

 C'est la valeur retournée par la fonction en utilisant return. Si le type de la fonction est void, la fonction ne renvoie pas de valeur. return redonne la main à la fonction appelante ou au processus père s'il s'agit de la fonction main. Si return est suivi d'une expression, celle-ci devient la valeur de la fonction et doit être compatible avec son type. Un return sans expression est parfois utilisé si la fonction est de type void.

int carre (int i)
{
 return i * i;
}


L'appel de la fonction


 Une fonction est appelée par son nom suivi de la liste des paramètres effectifs entre parenthèses. Un paramètre effectif est une expression de type compatible avec le type du paramètre formel de même rang.


Le passage de paramètres

 En C, les paramètres des fonctions sont passés exclusivement par valeur. Lors de l'appel, chaque paramètre formel est initialisé avec la valeur du paramètre effectif de même rang. Ainsi toute modification des paramètres formels n'a pas d'incidence sur les paramètres effectifs. Pour permettre à la fonction appelée de modifier une variable de la fonction appelante, il faut lui passer non pas la valeur de cette variable, mais son adresse. Ainsi à partir de son adresse, la fonction appelée peut directement manipuler la variable d'origine.


Le prototype


 Le prototype d'une fonction est en fait sa déclaration (en-tête). Il doit décrire comment s'utilise la fonction. Il n'est pas nécessaire de préciser le nom des paramètres.


Exemple :

Le prototype de la fonction carre ci-dessus est :

int carre(int);
 Une liste vide de paramètres signifie que l'on ne précise pas les paramètres : aucun contrôle ne peut être réalisé. Pour indiquer l'absence de paramètre il faut utiliser void :

float f ();  /* déclare une fonction f retournant un réel */
    /* aucun renseignement n'est donné sur le nombre ou le type des paramètres */

float f (void); /* déclare une fonction f sans paramètre */


L'ellipse


 L'ellipse "..." permet de ne fixer que les premiers paramètres de la liste. Elle permet d'écrire des fonctions capables de traiter un nombre variable d'arguments. Pour récupérer de façon portable les paramètres sans nom, il existe des outils prédéfinis (macros de la famille va_... incluses dans la librairie standard). Il est par exemple possible d'avoir une fonction qui calcule la moyenne de n valeurs, le premier paramètre indiquant le nombre de valeurs à traiter :

int moyenne (int nb, ...)
{
 /* calcul */
}

 Suivant ce principe, la fonction printf (appartenant à la libraire standard) formate un nombre variable de paramètres de type quelconque, le premier d'entre eux donnant des indications sur le nombre et le type des arguments suivants.


Exemple


 L'exemple suivant est un programme complet qui trie en ordre croissant 3 nombres saisis par l'utilisateur :

#include <stdio.h>

/* renvoie le plus grand de a et b */
int max (int a, int b)
{
 return a > b ? a : b;
}

/* renvoie le plus petit de a et b */
int min (int a, int b)
{
 return a < b ? a : b;
}

/* renvoie le plus grand de a, b et c */
int premier (int a, int b, int c)
{
 return max (a, max (b, c));
}

/* renvoie le plus petit de a, b et c */
int troisieme (int a, int b, int c)
{
 return min (a, min (b, c));
}

int deuxieme (int a, int b, int c)
{
 return troisieme (max (a, b), max (b, c), max (a, c));
/* équivalent à : premier (min (a, b), min (b, c), min (a, c) ) */
}

void main ()
{
 int x, y, z;

 printf ("Entrez 3 entiers : ");
 scanf ("%d %d %d", &x , &y, &z);
 printf ("Valeur triées par ordre croissant : %d %d %d\n",
 troisieme (x, y, z), deuxieme (x, y, z), premier (x, y, z) );
}


Téléchargez l'exemple


  Retour en haut de page Page suivante