Programmer en langage C
142
© Éditions Eyrolles
donc que :
adf est un pointeur sur une fonction à deux arguments (double et int) fournissant
un résultat de type int.
Si, par exemple, fct1 et fct2 sont des fonctions ayant les prototypes suivants :
int fct1 (double, int) ;
int fct2 (double, int) ;
les affectations suivantes ont alors un sens :
adf = fct1 ;
adf = fct2 ;
Elles placent, dans adf, l’adresse de la fonction correspondante (fct1 ou fct2). Dans ces
conditions, il devient possible de programmer un « appel de fonction variable » (c’est-à-dire
que la fonction appelée peut varier au fil de l’exécution du programme) par une instruction
telle que :
(* adf) (5.35, 4) ;
Celle-ci, en effet, appelle la fonction dont l’adresse figure actuellement dans adf, en lui transmettant les valeurs indiquées (5.35 et 4). Suivant le cas, cette instruction sera donc équivalente
à l’une des deux suivantes :
fct1 (5.35, 4) ;
fct2 (5.35, 4) ;
9.2 Fonctions transmises en argument
Supposez que nous souhaitions écrire une fonction permettant de calculer l’intégrale d’une
fonction quelconque suivant une méthode numérique donnée. Une telle fonction que nous
supposerons nommée integ posséderait alors un en-tête de ce genre :
float integ ( float(*f)(float), ..... )
Le premier argument muet correspond ici à l’adresse de la fonction dont on cherche à calculer
l’intégrale. Sa déclaration peut s’interpréter ainsi :
(*f)(float) est de type float,
(*f) est donc une fonction recevant un argument de type float et fournissant un résultat
de type float,
f est donc un pointeur sur une fonction recevant un argument de type float et fournissant
un résultat de type float.
Au sein de la définition de la fonction integ, il sera possible d’appeler la fonction dont on
aura ainsi reçu l’adresse de la façon suivante :
(*f) (x)
Delannoy Livre.book Page 142 Mercredi, 6. mai 2009 4:26 16
142
© Éditions Eyrolles
donc que :
adf est un pointeur sur une fonction à deux arguments (double et int) fournissant
un résultat de type int.
Si, par exemple, fct1 et fct2 sont des fonctions ayant les prototypes suivants :
int fct1 (double, int) ;
int fct2 (double, int) ;
les affectations suivantes ont alors un sens :
adf = fct1 ;
adf = fct2 ;
Elles placent, dans adf, l’adresse de la fonction correspondante (fct1 ou fct2). Dans ces
conditions, il devient possible de programmer un « appel de fonction variable » (c’est-à-dire
que la fonction appelée peut varier au fil de l’exécution du programme) par une instruction
telle que :
(* adf) (5.35, 4) ;
Celle-ci, en effet, appelle la fonction dont l’adresse figure actuellement dans adf, en lui transmettant les valeurs indiquées (5.35 et 4). Suivant le cas, cette instruction sera donc équivalente
à l’une des deux suivantes :
fct1 (5.35, 4) ;
fct2 (5.35, 4) ;
9.2 Fonctions transmises en argument
Supposez que nous souhaitions écrire une fonction permettant de calculer l’intégrale d’une
fonction quelconque suivant une méthode numérique donnée. Une telle fonction que nous
supposerons nommée integ posséderait alors un en-tête de ce genre :
float integ ( float(*f)(float), ..... )
Le premier argument muet correspond ici à l’adresse de la fonction dont on cherche à calculer
l’intégrale. Sa déclaration peut s’interpréter ainsi :
(*f)(float) est de type float,
(*f) est donc une fonction recevant un argument de type float et fournissant un résultat
de type float,
f est donc un pointeur sur une fonction recevant un argument de type float et fournissant
un résultat de type float.
Au sein de la définition de la fonction integ, il sera possible d’appeler la fonction dont on
aura ainsi reçu l’adresse de la façon suivante :
(*f) (x)
Delannoy Livre.book Page 142 Mercredi, 6. mai 2009 4:26 16
