« INFO517-cours10 » : différence entre les versions
Ligne 9 : | Ligne 9 : | ||
Un exemple qui rassemble un peu tout: on définit un type de pointeur sur les |
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 |
fonctions des entiers vers les entiers. On maintient une liste d'associations |
||
option (chaîne) |
option (chaîne) <math>\rightarrow</math> fonction (donnée par un pointeur). Le programme lit ses |
||
options et applique les transformations correspondantes, en partant de 0. |
options et applique les transformations correspondantes, en partant de 0. |
||
Version du 15 décembre 2008 à 13:14
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>