La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

CYCLE 6 : FONCTIONS FONCTIONS avec paramètres en Entrée/Sortie 1- Pourquoi les FONCTIONS peuvent échanger des données en E/S entre elles ? 2- Comment écrire.

Présentations similaires


Présentation au sujet: "CYCLE 6 : FONCTIONS FONCTIONS avec paramètres en Entrée/Sortie 1- Pourquoi les FONCTIONS peuvent échanger des données en E/S entre elles ? 2- Comment écrire."— Transcription de la présentation:

1 CYCLE 6 : FONCTIONS FONCTIONS avec paramètres en Entrée/Sortie 1- Pourquoi les FONCTIONS peuvent échanger des données en E/S entre elles ? 2- Comment écrire des FONCTIONS avec paramètre en E/S ? 3- Comment le CPU exécute des FONCTIONS avec paramètre en E/S ?

2 CYCLE 6 : FONCTIONS FONCTIONS avec paramètres en Entrée/Sortie 1- Pourquoi les FONCTIONS peuvent échanger des données en E/S entre elles ?

3 /* Initialisation d’un tableau */ float [] RemplirTableau(void) { float tabReel[3]; … return(tabReel); } 3 Les Entrées et Sorties ne suffisent pas : tableaux Fonction : un tableau ne peut pas être renvoyé en Sortie par une fonction.  Comment récupérer un tableau à partir d’une fonction ? Les tableaux modifiés par une fonction doivent donc être transmis par un autre mécanisme que la Sortie : Les paramètres en Entrée/Sortie sont transmis à la fonction (à l’appel) et modifiables par cette fonction.

4 /* Valeur absolue d’un entier, renvoie 1) la valeur absolue de x 2) le signe de x (+: 1, -: -1) */ int Vabs(int x) { int signe, abs; if (x<0)abs= -x; signe= -1; else abs= x; signe= 1; return(signe,abs); } 4 Les Entrées et Sorties ne suffisent pas : si plusieurs retours Fonction : une fonction ne peut pas renvoyer en Sortie plus d’une valeur.  Comment récupérer les 2 résultats de la fonction ? Un autre mécanisme doit donc permettre de transmettre une des 2 Sorties : Un paramètre passé en Entrée/Sortie (lors de l’appel) sera modifiable par la fonction.

5 5 Fonction avec paramètre en Entrée/Sortie

6 CYCLE 6 : FONCTIONS FONCTIONS avec paramètres en Entrée/Sortie 2- Comment écrire des FONCTIONS avec paramètre en E/S ?

7 7 Limitation des fonctions à 1 seule Sortie /* Valeur absolue d’un entier, renvoie 1) la valeur absolue de x 2) le signe de x (+: 1, -: -1) */ int Vabs(int x) { int signe, abs; if (x<0)abs= -x; signe= -1; else abs= x; signe= 1; return(signe,abs); } La fonction Vabs() doit renvoyer 2 résultats :  Or, 2 valeurs ne peuvent pas être renvoyées en Sortie par une fonction.  Donc, COMMENT PASSER la 2° variable (abs) à la fonction, de façon à ce qu’elle soit modifiable ?

8 8 Un paramètre en E ne peut pas être modifié par la fonction /* Valeur absolue d’un entier, renvoie 1) la valeur absolue de x 2) le signe de x (+: 1, -: -1) */ int Vabs(int x, int abs) { int signe; if (x<0)abs= -x; signe= -1; else abs= x; signe= 1; return(signe); } La fonction Vabs() doit renvoyer 2 résultats :  Or, une valeur transmise en Entrée ne permet pas de modifier la variable passée dans l’appel : le main() ne connaîtra pas le changement.  Donc, COMMENT PASSER la 2° variable à la fonction, de façon à ce qu’elle soit modifiable ?

9 9 Ecrire une fonction avec paramètre en E/S de type simple La fonction Vabs() doit renvoyer 2 résultats :  Or, 2 Sorties impossibles.  Or, paramètre en Entrée non modifiable.  Pour pouvoir modifier la variable, il faut passer l’adresse de cette variable, COMME dans le scanf() : la fonction a ainsi accès direct à la case RAM de cette variable. /* Appel à la fonction Valeur absolue, en passant une adresse */ sign= Vabs(a,&abs); /* a est l’entier de départ, sign est le signe de a, &abs est l’adresse RAM où sera stockée la valeur absolue */

10 Un paramètre en E/S est passé par ADRESSE 10 Un PARAMETRE en E/S est passé par adresse. Il est en lecture/écriture pour la fonction appelée, qui peut le modifier. Donc, la variable de type simple, dont l’adresse est passée, est modifiée directement par la fonction. passage paramètre par adresse  transmission adresse de la donnée

11 11 Un POINTEUR est une adresse. C’est un type de données : un pointeur pointe sur une variable de type simple. // pointeur x sur un int int n, *x; // initialisation x= &n; // utilisation *x= 3; x= &n *x= n  4 octets &x x &n  3 Le type POINTEUR : ADRESSE d’une simple variable COMMENT passer L’ADRESSE d’une variable à une fonction ?

12 12 /* PROTOTYPE FONCTION : void NomFonction(TYPES POINTEUR); */ void Vabs(int *); int main() { int a;... /* APPEL FONCTION : NomFonction(Adresse VariableE/S); */ Vabs(&a); } /* DEFINITION DE LA FONCTION void NomFonction(TYPES POINTEUR NOMSPARAMETRES); */ void Vabs(int *x) { *x=... } PARAMETRE en E/S : Transmettre l’adresse d’une variable de type simple à une fonction (utilisation des pointeurs)

13 13 /* PROTOTYPE FONCTION : void NomFonction(TYPETABLEAU); */ void RemplirTableau(float [ ]); int main() { float tabReel[3];... /* APPEL FONCTION : NomFonction(NOMTABLEAU); */ RemplirTableau(tabReel); } void RemplirTableau(float tabR[3])/* DEFINITION DE LA FONCTION */ { tabR[0]=... } Ecrire une fonction avec paramètre en E/S de type Tableau

14 Indices relatifs des cases du tableau Nom du tableau = adresse tableau =&tab[0] 254 tab[0]tab[1]tab[2] Nom des cases du tableau tab Adresses des cases du tableau tab=&tab[0] tab[0] 2&tab[1] tab[1] 5 &tab[2] tab[2] 4 RAM Précision sur le passage du nom du tableau

15 15 Un PARAMETRE en E/S est passé par adresse. Il est en lecture/écriture pour la fonction appelée, qui peut le modifier. Donc, le TABLEAU passé, est modifié directement par la fonction. Passage par ADRESSE (paramètre en E/S) : Tableau

16 CYCLE 6 : FONCTIONS FONCTIONS avec paramètres en Entrée/Sortie 3- Comment le CPU exécute des FONCTIONS avec paramètre en E/S ?

17 17 int main() { float tabReel[2]; int i; RemplirTableau(tabReel); for(i=0;i<2;i++) { printf( " \t%.2f",tabReel[i]); } } void RemplirTableau(float tabR[2]) { int i; for ( i=0 ; i<=1 ; i=i+1 ) {tabR[i]= i+1; } (tabReel) tabReel[0]: tabR tabReel[1]: --- tabReel[0]: 1 tabReel[1]: 2 Exécution CPU d’un passage de paramètre en E/S de type Tableau : quel est le lien entre tabReel et tabR ?

18 18 int main() { int a; printf("Donner a : "); scanf("%d",&a); printf("\na : %d", a); Vabs(&a); // valeur absolue printf("\na : %d", a);} void Vabs(int *x) { if (*x<0) { *x= - (*x); } } a: x *x= a: 2 Exécution CPU d’un passage de paramètre en E/S de type simple : quel est le lien entre a et x ?

19 19 /* PROTOTYPE FONCTION */ void Vabs(int *); int main() { int a;... /* APPEL FONCTION */ Vabs(&a); } /* DEFINITION DE LA FONCTION */ void Vabs(int *x) { *x=... } 1. Exécution de la fonction main() a. Déclaration et saisie de a : a reçoit -2 du clavier b. Appel fonction avec passage de l’adresse de a : Vabs(&a) 2. Exécution de la fonction appelée a. Initialisation des paramètres en E/S : x= &a a. Modification de la valeur de a : *x= -(-2). 3. Suite et fin du main() : le contenu de a a été modifié (2). Exécution CPU du passage de paramètre en Entrée/Sortie


Télécharger ppt "CYCLE 6 : FONCTIONS FONCTIONS avec paramètres en Entrée/Sortie 1- Pourquoi les FONCTIONS peuvent échanger des données en E/S entre elles ? 2- Comment écrire."

Présentations similaires


Annonces Google