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: <source lang="c">
- include <stdio.h>
/* Définition du type des transformations:
* pointeur sur une fonction des entiers vers les entiers. */
typedef int (*trans) (int) ;
/* Quelques transformations */
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[] = { "-s", succ, "-o", oppose, "-m", moitie, "-d", doubl, "-c", carre, NULL, NULL } ; int nb_options = 5 ;
for (i=1;i<argc;i++) { if ((f = cherche(argv[i],options,nb_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>