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

FONCTIONS avec paramètres en Entrée/Sortie

Présentations similaires


Présentation au sujet: "FONCTIONS avec paramètres en Entrée/Sortie"— Transcription de la présentation:

1 FONCTIONS avec paramètres en Entrée/Sortie
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 FONCTIONS avec paramètres en Entrée/Sortie
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 Les Entrées et Sorties ne suffisent pas : tableaux
/* Initialisation d’un tableau */ float [] RemplirTableau(void) { float tabReel[3]; return(tabReel); } 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 Les Entrées et Sorties ne suffisent pas : si plusieurs retours
/* Valeur absolue d’un entier, renvoie ) la valeur absolue de x ) 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); } 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 est l’adresse d’une case RAM transmise à la fonction :
Fonction avec paramètre en Entrée/Sortie Un paramètre en E/S est l’adresse d’une case RAM transmise à la fonction : Le contenu de la case sera modifiable par la fonction…

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

7 Limitation des fonctions à 1 seule Sortie
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 ? /* Valeur absolue d’un entier, renvoie ) la valeur absolue de x ) 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); }

8 Un paramètre en E ne peut pas être modifié par la fonction
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 ? /* Valeur absolue d’un entier, renvoie ) la valeur absolue de x ) 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); }

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
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 Le type POINTEUR : ADRESSE d’une simple variable
COMMENT passer L’ADRESSE d’une variable à une fonction ? 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 &x &n *x= n 3 x= &n 4 octets

12 nom différent dans appel et définition
PARAMETRE en E/S : Transmettre l’adresse d’une variable de type simple à une fonction (utilisation des pointeurs) /* 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= ... nom différent dans appel et définition

13 Ecrire une fonction avec paramètre en E/S de type Tableau
/* 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]= ... nom différent dans appel et définition

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

15 Passage par ADRESSE (paramètre en E/S) : Tableau
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.

16 FONCTIONS avec paramètres en Entrée/Sortie
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 Exécution CPU d’un passage de paramètre en E/S de type Tableau : quel est le lien entre tabReel et tabR ? 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; } } @2 (tabReel) tabR= tabReel tabReel[0]: --- tabReel[0]: 1 @4 tabR tabReel[1]: --- tabReel[1]: 2

18 Exécution CPU d’un passage de paramètre en E/S de type simple : quel est le lien entre a et x ?
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); } @3 x *x= a: 2 a: -2 x=

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


Télécharger ppt "FONCTIONS avec paramètres en Entrée/Sortie"

Présentations similaires


Annonces Google