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

GEF 243B Programmation informatique appliquée Pointeurs aux fonctions, allocation dynamique de la mémoire et tableaux de pointeurs §10.4 – 10.5, Apx I.

Présentations similaires


Présentation au sujet: "GEF 243B Programmation informatique appliquée Pointeurs aux fonctions, allocation dynamique de la mémoire et tableaux de pointeurs §10.4 – 10.5, Apx I."— Transcription de la présentation:

1 GEF 243B Programmation informatique appliquée Pointeurs aux fonctions, allocation dynamique de la mémoire et tableaux de pointeurs §10.4 – 10.5, Apx I

2 21-Jan-14 2 JGA Beaulieu Revue Répondez dans quelle région de mémoire du programme sont chacune des lignes suivantes: Code, pile, données ou tas: //A program int i = 0; //où? void main (void) { int j = 0;// où? j++;// où? } int Fctn () { static int k = 0; // où? int l = 0;// où? l = l + 5;// où? }

3 21-Jan-14 3 JGA Beaulieu Synopsis Pointeurs aux fonctions Allocation dynamique de la mémoire 1.malloc() 2.calloc() 3.free() Tableaux de pointeurs

4 21-Jan-14 4 JGA Beaulieu Pointeurs aux fonctions Les fonctions occupent de lespace de mémoire tout comme les autres entités de code tel que les variables, tableaux, structures… Le nom dune fonction est un pointeur constant similaire au nom dun tableau Il est donc possible davoir des variables pointeurs qui peuvent pointer à des fonctions Tout comme il est possible davoir des variables pointeurs qui pointent aux tableaux

5 21-Jan-14 5 JGA Beaulieu Pointeurs aux fonctions La syntaxe pour la déclaration dun pointeur à une fonction est différente des autres types de pointeurs On se souvient quune variable de pointeur est déclaré avec le type du pointeur, létoile * et le nom de la variable pointeur : int* pInt; //un pointeur à un int char* pChar; //un pointeur à un char

6 21-Jan-14 6 JGA Beaulieu Pointeurs aux fonctions La syntaxe de déclaration pour un pointeur à une fonction est similaire à une déclaration de prototype 1.Elle commence avec le type de la fonction (ce que la fonction retourne), 2.Le nom de la variable pointeur à une fonction entre parenthèse (par convention on utilise fp pour commencer le nom) et, 3.Les types des paramètres entre parenthèses: int (*fpInts) (int, int); void (*fpConverti) (char); char* (*fpString) (char*,char*);

7 21-Jan-14 7 JGA Beaulieu Pointeurs aux fonctions Une des utilisations principales des pointeurs aux fonctions est de passer le nom dune fonction (son adresse) à un gestionnaire de tâches Le pointeur à une fonction est donc utilisé pour démarrer des tâches dans certains systèmes Une des raisons principales pour utiliser des pointeurs aux fonctions est que le nom dune fonction tâche peut ne pas être connu avant le temps dexécution La flexibilité que nous donne les pointeurs aux fonctions est donc un élément clé pour concevoir des systèmes dynamiques

8 On peut passer un pointeur à une fonction comme paramètre à une autre fonction: #include void ExecUnit(void (*fp) (int, int), int, int); void Difference (int a, int b); void main(void) { ExecUnit(Difference, 5,4); getchar(); } void Difference (int a, int b) { printf("Difference is: %d", a-b); return; } void ExecUnit(void (*fp) (int, int), int c, int d) { (*fp)(c,d); return; }

9 21-Jan-14 9 JGA Beaulieu Allocation dynamique de la mémoire Demander plus de mémoire… Et lobtenir.

10 21-Jan JGA Beaulieu Allocation dynamique de la mémoire SVP monsieur, jen veux plus

11 21-Jan JGA Beaulieu Allocation dynamique de la mémoire Nous avons vue un exemple de malloc quand nous avons appris les pointeurs à void La fonction malloc retourne un bloc de mémoire qui contient le nombre doctets spécifié par son paramètre. La fonction retourne un pointeur à void pour le premier octet du bloc de mémoire nouvellement alloué La mémoire allouée contient des déchets

12 21-Jan JGA Beaulieu Allocation dynamique de la mémoire Le prototype de malloc (tel que définit dans le langage) est montré ici: void* malloc (size_t size); Le typedef size_t est définit dans plusieurs fichiers entête incluant stdio.h et mem.h Il est habituel dutiliser lopérateur sizeof() quand on demande de la mémoire: int* pInt = NULL; pInt = (int *)malloc (sizeof(int));

13 21-Jan JGA Beaulieu Allocation dynamique de la mémoire Un appel à malloc demande de la mémoire sur le tas. Si il ny a pas assez de mémoire sur le tas du programme, vous avez une condition qui sappelle débordement Cest la responsabilité du programmeur de sassurer quun débordement ne se produit pas, ou de résoudre le problème si cela se produit pInt = (int *)malloc (sizeof(int)) if (pInt == NULL) exit(1); //Pas de mémoire disponible Si on laisse un débordement se produire sans le traiter, on peut obtenir des résultats invalides ou un crash.

14 21-Jan JGA Beaulieu Allocation dynamique de la mémoire calloc est une autre façon de demander de la mémoire. Cette fonction est surtout utilisée pour les tableaux. calloc diffère de malloc de deux façons principales: Elle alloue un bloc contiguë de mémoire capable de contenir tout le tableau. Elle demande que lon connaisse le nombre des éléments dans le tableau et la grosseur des éléments calloc claire toute la mémoire avec des zéros

15 21-Jan JGA Beaulieu Allocation dynamique de la mémoire Vous utilisez calloc comme suit: int* pInt = NULL; if (!pInt = (int*)calloc (200,sizeof(int)))) exit(1); //pas de mémoire sort Cet appel donne de la mémoire pour un tableau de 200 éléments de type int

16 21-Jan JGA Beaulieu Allocation dynamique de la mémoire Vous devriez toujours relâcher la mémoire quand vous en avez plus besoin Pour ce faire vous utilisez la fonction free pour relâcher la mémoire dynamique free(pInt);//relâche le bloc de //mémoire pointé par pInt

17 21-Jan JGA Beaulieu Allocation dynamique de la mémoire Quand vous utilisez la fonction free, cest le bloc de mémoire à qui lon pointe qui est relâché. La variable pointeur existe encore. Le pointeur contient ladresse du bloc de mémoire même après le free !!! Une erreur commune est dutiliser un pointeur à un bloc de mémoire après un free. Cest une bonne pratique que de mettre le pointeur à NULL immédiatement après un appel à free

18 21-Jan JGA Beaulieu Tableaux de pointeurs Une des structures les plus utiles que nous pouvons construire avec la mémoire dynamique est un tableau de pointeurs Ce genre de structure est utile quand le nombre déléments varie de rangée en rangée dans le tableau. Nous pourrions utiliser un tableau de grandeur fixe (2-D) avec la dimension maximum qui est égale à la plus grande rangée, mais cela serait une perte despace

19 21-Jan JGA Beaulieu Tableaux de pointeurs Vous déclarez un tableau de pointeurs comme suit: int** table; Après la déclaration, vous demandez de la mémoire pour chaque rangée dans le tableau à 2-D. La prochaine diapo provient de votre livre de C Forouzan edition 2 (p.492)

20

21 21-Jan JGA Beaulieu Quiz Time Quelle est la syntaxe pour déclarer un pointeur à une fonction? Où est-ce que la mémoire est allouée pour les fonctions malloc et calloc ?


Télécharger ppt "GEF 243B Programmation informatique appliquée Pointeurs aux fonctions, allocation dynamique de la mémoire et tableaux de pointeurs §10.4 – 10.5, Apx I."

Présentations similaires


Annonces Google