INFO517-cours10
Séance 10 du Cours-TD de Programmation C.
Deuxième partiel
Le sujet: INFO517-Partiel2.pdf.
Pointeurs sur fonctions
Un exemple qui rassemble un peu tout: on définit un type de pointeur sur les fonctions des entiers vers les entiers. On maintient une liste d'associations option (chaîne) -> fonction (donnée par un pointeur). Le programme lit ses options et applique les transformations correspondantes, en partant de 0.
<source lang="c">
- include <stdio.h>
- include <string.h>
- include <stdlib.h>
/* Définition du type des transformations:
* pointeur sur une fonction des entiers vers les entiers. */
typedef int (*trans) (int) ;
/* Quelques transformations */
int identite (int n) { return n ; }
int succ (int n) { return n+1 ; }
int oppose (int n) { return -n ; }
int moitie (int n) { return n/2 ; }
int doubl (int n) { return 2*n ; }
int carre (int n) { return n*n ; }
/* Application d'une transformation */
void applique (int *n, trans f) { *n = f(*n) ; }
/* Gestion d'une table d'association: option -> transformation */
typedef struct { const char *opt ; trans f ; } assoc ;
/* Une table d'association est un tableau d'éléments du type `assoc', terminé
* par le couple (NULL,NULL). */
trans cherche (const char *opt, assoc table[]) { int i = 0 ; while (table[i].opt != NULL && strcmp(table[i].opt,opt) != 0) ++i ; return table[i].f ; }
/* Programme principal: pour chaque option donnée, on cherche la transformation
* correspondante et on l'applique à n. */
int main (int argc, const char **argv) { int n = 0 ; int i ; trans f ;
/* Table d'association */ assoc options[] = { {"-i", identite}, {"-s", succ}, {"-o", oppose}, {"-m", moitie}, {"-d", doubl}, {"-c", carre}, {NULL, NULL} } ;
for (i=1;i<argc;i++) { if ((f = cherche(argv[i],options)) == NULL) { fprintf(stderr,"Option non reconnue: \"%s\".\n",argv[i]) ; return EXIT_FAILURE ; } applique(&n,f) ; printf("%d\n",n) ; } return EXIT_SUCCESS ; } </source>