la programmation modulaire(1/3)




        Diviser pour mieux regner !.

Quel est l'utilité de faire plusieurs fonctions ?
Un programme ecrit d'un seul tenant devient difficile a comprendre dès qu'il depasse les 300 lignes.
Les fonctions permettent de découper les gros traitements en plusieurs petits qui rendrons le programme plus clair et plus facile à corriger en cas d'erreur.
Une bonne fonction main n'est en fait qu'une suite d'appels de fonctions aux noms evocateurs qui rendent la vie plus facile à ceux qui essaye de comprendre votre code source (sur tout dans le cas de travil en équipe).
Enfin la programmation sur pluseur fichier comme nous le verrons permet de mettre en communs des fonctions qui serons utile à plusieur programmes.




déclaration et définition d'une fonction en C


        

#include <stdio.h>

//déclaration des fonctions contenue dans le fichier
int addition(int operande1, operande2);

/**
  * fonction principale
  */
void main()
{
  //déclaration et définition des variables locales
  int nombre1 = 5;
  int nombre2 = 7;

 //on affiche le résultat de l'addition
  printf("l'addition de %d et de %d fait : %d\n",
      nombre1,
      nombre2,
  addition(nombre1, nombre2));
}

/**
* fonction addition
* renvois le resultat de l'addition des deux nombres passés en parametre
*/
int addition(int operande1, int operande2)
{
  //declarer de la variable contenant la valeur a renvoyer
  int resultat;

//definir de reultat
resultat = operande1 + operande2;

//renvoyer le resultat
return resultat;
}


Nous déclarons tout d'abord la fonction addition, afin que le compilateur prenne connaisance de cette fonction. Sur de petits listing comme celui-ci cette opération peut être omise mais sur de grands sources elle est obligatoire.
Le compilateur apprend plusieur choses :

int addition(int operande1, operande2);


Tout d'abord le nom de la fonction (addition), ensuite le nombre de paramêtres qu'elle accepte dans sa signature (ici deux entiers), enfin la valeur qu'elle retourne à la fonction appellante (toujours un entier).



la fonction addition


Si une fonction appelle "addition" et qu'elle ne respecte pas ces differents attributs (passage d'un seul arguement par exemple) le compilateur emmetra une erreur.
Cet appel ce fait justement dans la fonction printf à l'interieur de main :

printf("l'addition de %d et de %d fait : %d",       nombre1,      nombre2,   addition(nombre1, nombre2));


Ici, on passe à addition nos deux variables nombre1 et nombre2, et on indique implicitement que la valeur retournée sera renvoyée à la troisième balise '%d' (voir shéma ci-contre).
Observons maintenant la fonction addition :

int addition(int operande1, int operande2)
{
  //declarer de la variable contenant la valeur a renvoyer
  int resultat;

  //definir de reultat
  resultat = operande1 + operande2;

  //renvoyer le resultat
  return resultat;
}


La variable résultat est une variable locale, c'est à dire une variable qui n'est accessible qu'a l'interieur de la fonction addition (de même que "nombre1" et "nombre2" pour la fonction main). Toute référence à "resultat" en dehors de cette fonction conduira à une erreur. Nous verrons plus tard qu'avec les pointeurs il nous suffira d'employer l'adresse de cette variable en mémoire).
L'instruction d'affectation suivante est classique pour nous maintenant , interressons plutôt à "return".
L'instruction return fournit la valeur de retour de la fonction (ici 5+7 = 12), mais elle permet aussi d'interrompre le déroulement d'une fonction en revenant dans la fonction qu'il l'a appellé.
Il aurais été plus judicieux d'écrire notre fonction de la sorte :

int addition(int operande1, int operande2)
{
  //renvoyer le resultat
 return (operande1 + operande2);
}


Si une fonction ne prend aucun arguments nous utiliserons le mot clé "void" :

int maFonction(void)


de même lorsqu'une fonction ne renvois rien, le même mot clé est utilisé :

void monAutreFonction(void)


Nous pourrons ainsi creer des fonctions du genre :

void erreur(short numeroLigne)
{
 printf("une erreur s'est produite ligne %d\n", numeroLigne);
}





communicatition entre la fonction main et addition






les variables globales


        Une variable déclarée "static" est une variable dont la valeur se conserve entre les différents appels d'une même fonction. Cette variable ne sera tout de même accéssible que dans l'espace de cette fonction.

void main(void)
{
  //incrementation
  int increment;

  //pour tous les incrmeent de 0 à 3
  for (increment = 0 ; increment < 4 ;increment++)
     incrementation();
}

void incrementation(void)
{
  static i;
  i++;
  printf("increment = %d\n", i);
}


nous aurons la sortie suivante :

increment = 1
increment = 2
increment = 3
increment = 4


Nous voyons bien que la valeur de i augmente à chaque appel, et que celle-ci, tout comme une variable globale a été initialisée à zero.


Nous verrons dans les deux prochains cours comment creer plusieurs fichiers c et les compiler pour donner un seul executable, le pré-proccésseur.
D'ici là programmez bien !




Précédent  |  Index  |  Suivant  ]


par Valentin BILLOTTE
Dernière mise à jour: 06/02/2001 - 01:46:36