« INFO517-cours10 » : différence entre les versions

De Wiki du LAMA (UMR 5127)
Aller à la navigation Aller à la recherche
(pointeurs sur fonctions)
 
Ligne 7 : Ligne 7 :
== Pointeurs sur fonctions ==
== Pointeurs sur fonctions ==


Un exemple qui rassemble un peu tout:
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">
<source lang="c">
#include <stdio.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>


/* Définition du type des transformations:
/* Définition du type des transformations:
Ligne 17 : Ligne 23 :


/* Quelques transformations */
/* Quelques transformations */

int identite (int n)
{
return n ;
}


int succ (int n)
int succ (int n)
Ligne 76 : Ligne 87 :
/* Table d'association */
/* Table d'association */
assoc options[] = {
assoc options[] = {
"-s", succ,
{"-i", identite},
"-o", oppose,
{"-s", succ},
"-m", moitie,
{"-o", oppose},
"-d", doubl,
{"-m", moitie},
"-c", carre,
{"-d", doubl},
NULL, NULL
{"-c", carre},
{NULL, NULL}
} ;
} ;
int nb_options = 5 ;


for (i=1;i<argc;i++) {
for (i=1;i<argc;i++) {
if ((f = cherche(argv[i],options,nb_options)) == NULL) {
if ((f = cherche(argv[i],options)) == NULL) {
fprintf(stderr,"Option non reconnue: \"%s\".\n",argv[i]) ;
fprintf(stderr,"Option non reconnue: \"%s\".\n",argv[i]) ;
return EXIT_FAILURE ;
return EXIT_FAILURE ;
Ligne 94 : Ligne 105 :
}
}
return EXIT_SUCCESS ;
return EXIT_SUCCESS ;
}
}

</source>
</source>

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

  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>