« INFO517-cours10 » : différence entre les versions
(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[] = { |
||
"- |
{"-i", identite}, |
||
"- |
{"-s", succ}, |
||
"- |
{"-o", oppose}, |
||
"- |
{"-m", moitie}, |
||
"- |
{"-d", doubl}, |
||
{"-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 |
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">
- 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>