Вы находитесь на странице: 1из 34

Dpartement Gnie Civil Dpartement Mcanique nergtique

Les fonctions
1. 2. 3. 4. Introduction Mise en uvre Passage par valeur et par adresse Pour aller plus loin

Prog. Struct. - C

IV - Les Fonctions

Introduction
Une fonction vue du processeur
C'est un code excutable une adresse en mmoire termin par une instruction de retour l'appel de la fonction, le -processeur excute le code partir de l'adresse de la fonction et l'instruction retour le fait revenir l'instruction suivant l'appel. Des donnes peuvent tre transmises la fonction en paramtres. Lors du retour une valeur peut tre rcupre.

Prog. Struct. - C

IV - Les Fonctions

Instruction i ; Appel MaFonction() ;


Adresse

Instruction i+2 ;

MaFonction Instruction1 de MaFonction La suite de MaFonction Instruction return()

Prog. Struct. - C

IV - Les Fonctions

Exemple : Instruction i ; X = sqrt(4) ;


Adresse

Instruction i+2 ;

4
if (argument>0) Le calcul de sqrt(4)

sqrt(argument)

Return 2

Retour de 2

Prog. Struct. - C

IV - Les Fonctions

Du point de vue du programmeur


Un programme est un ensemble de fonctions, Il s'excute partir de la fonction main (), En programmation structure, le programme est divis en fonctions qui ralisent chacune une partie de la tche. Ceci facilite l'organisation et la mise au point du programme. Un programmeur professionnel utilise des bibliothques de fonctions pour acclrer le dveloppement de son application.

Prog. Struct. - C

IV - Les Fonctions

Instruction i; MaFonction(10,x+y,z); Instruction_suiv; z Passage de x+y paramtres 10 { Instructions De MaFonction return; }


Prog. Struct. - C
IV - Les Fonctions

MaFonction

Fonction : Mise en uvre


#include <stdio.h> /* 1) Le Prototypage */ int main() { /* 3) L'appel */ } /* 2) La dfinition */

Prog. Struct. - C

IV - Les Fonctions

1) Le Prototypage
Type_Ret Ident_fonc (,Type Argument,);
Exemples : double CalcDiscri (double Arga,double Argb,double Argc); int printf (const char *pFormat, ); void fdouble (double *pVar); Localisation : #include <stdio.h> //c'est ICI pour le prototypage des fonctions int main() { }

Prog. Struct. - C

IV - Les Fonctions

2) La Dfinition
Arguments formels
Exemple : double CalcDisc(double Arga,double Argb,double Argc) { //Dclaration des variables si besoin return Argb*Argb-4*Arga*Argc;
}

Localisation :

#include <stdio.h> //prototypage des fonctions int main() { }

//Dfinition des fonctions

Prog. Struct. - C

IV - Les Fonctions

3) L'appel de la fonction
{ double ValDisc; ValDisc = CalcDisc (a,b,c); } Paramtres de la fonction

Localisation de l'appel : dans n'importe quelle dfinition de fonction, y compris dans sa propre dfinition Rcursivit
Prog. Struct. - C
IV - Les Fonctions

10

Ma premire fonction

\fonctions\exemple1.prj

Prog. Struct. - C

IV - Les Fonctions

11

2 types de fonctions
Les fonctions qui retournent quelque chose (si on ne met rien, une fonction retourne un entier (int) par dfaut). Pour cela, il faut utiliser l'instruction return : return expression;

EXEMPLE :
/* Une fonction calculant le produit de deux entiers */ /* Paramtres d'entre : deux entiers, Type retour : entier */

int calcule_produit (int iExp1, int iExp2) { int iProduit; iProduit = iExp1 * iExp2; return iProduit;

Prog. Struct. - C

IV - Les Fonctions

12

2 types de fonctions

Les fonctions qui ne retournent rien (void) : void nom_fonction(dclarations_d'arguments) Elles sont galement appeles procdures.

EXEMPLE :
/* Procdure affichant le produit de deux entiers */ /* Paramtres d'entre : deux entiers, Type retour : rien */

void affiche_produit (int iExp1, int iExp2) { int iProduit; iProduit = iExp1 * iExp2; printf ("Le produit de %d et %d est gal %d", iExp1, iExp2, iProduit);

Prog. Struct. - C

IV - Les Fonctions

13

Passage de paramtres : par valeurs


//Prototypage void fonction1(double z); //Dfinition void fonction1(double z) { z = z * 2.0; printf("z = %lf\n",z); }
Lors de l'appel de la fonction, le contenu de la zone repre par z sera * par 2
Prog. Struct. - C
IV - Les Fonctions

On indique au compilateur que fonction1 est une fonction qui ne retourne rien et qui admet pour paramtre un double

On donne le code de la fonction. Le compilateur rserve 8 octets de la pile dsigns par z. Pour le moment, le contenu de cette zone est indtermin.

14

Excution : Appel de la fonction


//A l'intrieur de la fonction appelante par exemple le main() double x = 20.0; ... fonction1 (x);

Zone de 8 octets rserve par x

20.0

pile

Zone de 8 octets rserve pour z

20.0

Prog. Struct. - C

IV - Les Fonctions

15

En fin dexcution
void fonction1 (double z) { z = z*2.0; }

Zone de 8 octets rserve par x Hors de porte de fonction1

20.0

pile Zone de 8 octets rserve par z 20.0 40.0

Prog. Struct. - C

IV - Les Fonctions

16

Aprs lexcution
Zone de 8 octets rserve par x de nouveau accessible

20.0

La zone mmoire rserve pour z nest plus accessible et le contenu de x na pas t modifi.

pile

Prog. Struct. - C

IV - Les Fonctions

17

Passage de paramtres : par adresse


//Prototypage void fonction2(double *pz);
On indique au compilateur que fonction2 est une fonction qui ne retourne rien et qui admet pour paramtre un pointeur sur double 4 octets dsigns par pz sont rservs dans la pile.

void fonction2 (double *pz) { *pz = (*pz)*2.0; }


Ce qui est point par pz sera multipli par 2 lors de l'appel de la fonction.
Prog. Struct. - C
IV - Les Fonctions

18

Excution : Appel de la fonction


//A l'intrieur de la fonction appelante double x = 20.0; ... fonction2 (&x);

Zone de 8 octets rserve par x

20.0

pile

4 octets rservs par pz

&x

Prog. Struct. - C

IV - Les Fonctions

19

En fin dexcution

x inaccessible par fdouble_2, mais atteint par adressage indirect

20.0 40.0

void fonction2 (double *pz) { *pz *= 2.0; }

pile 4 octets rservs pour pz

&x

Prog. Struct. - C

IV - Les Fonctions

20

Aprs lexcution
8 octets rservs par x de nouveau accessible

40.0

La zone mmoire rserve pour pz nest plus accessible et le contenu de x a t modifi par adressage indirect.

pile

Prog. Struct. - C

IV - Les Fonctions

21

Ma deuxime fonction

val_et_adr.prj Exemple

Prog. Struct. - C

IV - Les Fonctions

22

Rappels sur les fonctions


3 tapes pour la mise en uvre : La dfinition, Le prototypage, et l'appel. Les arguments : (constante, variable, expression, fonction) Si pas void alors return la fin de la dfinition Passage par valeur et passage par adresse

Prog. Struct. - C

IV - Les Fonctions

23

Squelette d'un programme


Zone des directives de prprocesseur #include Que se cache-t-il dans stdio.h ? #define Dclaration des variables de porte fichier Prototypage des fonctions Dfinition de la fonction main() int main() { } Dfinition de vos fonctions
Prog. Struct. - C
IV - Les Fonctions

24

A RETENIR !!

Pour modifier le contenu d'une variable dclare dans la fonction appelante par la fonction appele, il est ncessaire de passer en paramtre l'adresse de cette variable. Donc, dans le prototypage et la dfinition de la fonction, l'argument doit tre un pointeur.

Prog. Struct. - C

IV - Les Fonctions

25

Pour aller plus loin


1. 2. 3. 4. La rcursivit La porte des variables : locales ou globales Les tableaux comme arguments Les pointeurs sur fonctions

Prog. Struct. - C

IV - Les Fonctions

26

1) La Rcursivit
La fonction s'appelle elle-mme ! Exemple :
double Factorielle (int n); double Factorielle (int n) { if (n <= 0) return 1; } //Prototype

Condition d'arrt Appel rcursif

return n*Factorielle (n-1);

factorielle.prj
Prog. Struct. - C
IV - Les Fonctions

27

2) La porte des variables


Les variables locales sont temporaires Les variables globales sont permanentes Attention ne pas toutes les appeler n!!!
varlife.prj

Prog. Struct. - C

IV - Les Fonctions

28

3) Tableaux passs en paramtres une fonction


Tableaux une dimension (un indice) Type_ret Ident(Type_Tab *ptab, int nSize, ); OU Type_ret Ident(Type_Tab Tab[], int nSize, ); ex : void affichetableau(float *ptab, int Nb);

Prog. Struct. - C

IV - Les Fonctions

29

3) Tableaux passs en paramtres une fonction


Tableaux deux dimensions (2 indices) Type_ret Ident(Type_Tab Tab[][NCOL], int nLign, ); OU

Type_ret Ident(Type_Tab (*pTab)[NCOL], int nLign, );

ex : void affiche2D(float *ptab[10], int Nblig);


Prog. Struct. - C
IV - Les Fonctions

30

4) Les Pointeurs sur fonction


Dclaration Affectation Utilisation

Prog. Struct. - C

IV - Les Fonctions

31

Dclaration d'un pointeur sur fonction


Type_Val_Ret(*Ident_ptr_Fonc)(Signature_fonc); Signature_fonc
Liste ordonne des types des arguments de la fonction sans les identificateurs des arguments pFonc est un pointeur sur une fonction retournant un double et admettant un double en argument.
32

Exemple double (*pFonc)(double);


Prog. Struct. - C

IV - Les Fonctions

Initialisation, Affectation d'un pointeur sur fonction


double (*pFonc)(double); Ncessite #include <math.h>

double (*pTabFonc [3])(double)={sin,cos,tan}; pFonc = MaFonc; Le prototype de MaFonc doit tre connu par le compilateur.

Prog. Struct. - C

IV - Les Fonctions

33

Pointeurs sur fonction

pointfonct.prj

Prog. Struct. - C

IV - Les Fonctions

34

Вам также может понравиться