INFO517-cours10

De Wiki du LAMA (UMR 5127)
Aller à la navigation Aller à la recherche

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">

  1. include <stdio.h>
  2. include <string.h>
  3. 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>