Exercices sur les pointeurs
lireCar/remettreCar Lorsque l’on lit caractère par caractère, on ne peut pas savoir qu’on a atteint un caractère avant de l’avoir lu. Par exemple pour lire les caractères d’un nombre, tant qu’on a pas vu le premier caractère autre qu’un chiffre, le nombre est incomplet La solution est de dé-lire le dernier caractère : le remettre dans le buffer (en fait, on va utiliser notre propre buffer)
lireCar/remettreCar Ces deux fonctions se partagent un tableau (buffer) de char défini comme une variable globale et l’indice du dernier élément de ce tableau int lireCar(void) donne le premier caractère à prendre en compte: il se trouve soit dans le buffer, soit sur l’entrée standard. int remettreCar(char c) met dans le buffer un caractère que l’on veut dé-lire.
Correction #define TAILLETAMP 100 char tamp[TAILLETAMP]; int ptamp = 0; int lireCar( void ){ if( ptamp 0 ) return( tamp[--ptamp] ); else return( getchar() ); } void remettreCar( int c ){ if( ptamp = TAILLETAMP) printf(```remettreCar: trop de caractères \n``); else tamp[ptamp++] = c; }
Gestion d’une pile Un allocateur rudimentaire de mémoire. Deux sous programmes, une zone mémoire et un pointeur. –char tampalloue[TAILLEALLOUE]; –char *palloue = tampalloue; emplacement libre suivant –char *allouer(int n); retourne un pointeur p sur n positions consécutives de caractères dans la zone tampalloue –void liberer(char *p); Rudimentaire: libérer dans le sens inverse des allocations (tas)
schéma occupélibre Tampalloue: palloué occupé libre Tampalloue: palloué Après alloué
Correction char *allouer(int n){ if(tampalloue + TAILLEALLOUE –palloue =n){ /* il y a assez de place */ palloue += n; return(palloue - n); } else return 0; } void liberer(char *p){ if(p = tampalloue && p tampalloue + TAILLEALLOUE) palloue = p; }