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 tte


 L'en-tte comporte le type de la valeur de retour, l'identificateur de la fonction et la liste des paramtres formels entre parenthses. Les parenthses sont obligatoires mme si la liste est vide. Les paramtres sont spars par une virgule et il faut prciser pour chaque paramtre son type et son nom :

int f (float x, float y);

/* f est une fonction 2 paramtres rels x et y et retourne un entier */


Le corps de la fonction


Le corps de la fonction est une instruction compose, c'est dire un bloc compos de dclarations, de dfinitions et d'instructions.


La valeur de retour

 C'est la valeur retourne 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 pre 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 appele par son nom suivi de la liste des paramtres effectifs entre parenthses. Un paramtre effectif est une expression de type compatible avec le type du paramtre formel de mme rang.


Le passage de paramtres

 En C, les paramtres des fonctions sont passs exclusivement par valeur. Lors de l'appel, chaque paramtre formel est initialis avec la valeur du paramtre effectif de mme rang. Ainsi toute modification des paramtres formels n'a pas d'incidence sur les paramtres effectifs. Pour permettre la fonction appele 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 appele peut directement manipuler la variable d'origine.


Le prototype


 Le prototype d'une fonction est en fait sa dclaration (en-tte). Il doit dcrire comment s'utilise la fonction. Il n'est pas ncessaire de prciser le nom des paramtres.


Exemple :

Le prototype de la fonction carre ci-dessus est :

int carre(int);
 Une liste vide de paramtres signifie que l'on ne prcise pas les paramtres : aucun contrle ne peut tre ralis. Pour indiquer l'absence de paramtre il faut utiliser void :

float f ();  /* dclare une fonction f retournant un rel */
    /* aucun renseignement n'est donn sur le nombre ou le type des paramtres */

float f (void); /* dclare une fonction f sans paramtre */


L'ellipse


 L'ellipse "..." permet de ne fixer que les premiers paramtres de la liste. Elle permet d'crire des fonctions capables de traiter un nombre variable d'arguments. Pour rcuprer de faon portable les paramtres sans nom, il existe des outils prdfinis (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 paramtre 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 paramtres 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 tries par ordre croissant : %d %d %d\n",
 troisieme (x, y, z), deuxieme (x, y, z), premier (x, y, z) );
}


Tlchargez l'exemple


  Retour en haut de page Page suivante