INFO517-cours10

De Wiki du LAMA (UMR 5127)
Révision datée du 15 décembre 2008 à 13:06 par Lvaux (discussion | contributions) (pointeurs sur fonctions)
(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)
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: <source lang="c">

  1. 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>