Introduction au langage C/Pointeurs de fonctions
Exemple d'algorithme pour l’utilisation de pointeurs de fonctions
modifierExemple sans pointeur
On écrit une fonction graphique.
Cette fonction dessine f.
//INITIALISATION : f est une FORME GRAPHIQUE f := "_/-\_" //. //DECLARATION DE LA FONCTION dessine_f : fonction dessine_f() dessine f fin de fonction
Cela donne le résultat :
_/-\_
Avec la fonction f qui est fixe, dessine_f() ne sait dessiner que la forme "_/-\_".
Si on remplace la valeur intrinsèque de f par un pointeur de fonction, la fonction pourra dessiner n’importe quelle forme.
Même exemple en utilisant un pointeur de fonction
En C, le nom d'une fonction est un pointeur. On peut l’utiliser comme argument :
//INITIALISATION : g, h sont des FORMES GRAPHIQUES g := "/-\/-\" h := "--\/--" //. //DECLARATION DE LA FONCTION dessine_f : fonction dessine_f(P_f) dessine P_f() fin de fonction //. dessine_f(g) donnera :"/-\/-\" dessine_f(h) donnera :"--\/--"
Voir Exemple graphique (avec Gnuplot) ci-dessous.
Exemple graphique (avec Gnuplot)
modifier- Passer un pointeurs de fonctions à une fonction.
Code source
modifier- La fonction Gplt() dessine f(x) et g(x)...
- On peut remarquer que les pointeurs de fonctions ont les mêmes types arguments que les fonctions qu’ils vont recevoir.
/* ------------------------------ */
#include <stdio.h>
#include <math.h>
/* ------------------------------ */
/* --- Dessinons f et g --------- */
double f(double x){return( pow(x,2.));}
double g(double x){return(2.0*x + 3.0);}
/* ------------------------------ */
/* ----- Fonction graphique ----- */
void Gplt(
double (*P_f)(double x)/* Pointeur de fonction */
)
{
FILE *fp;
double a;
fp = fopen("data","w");
for(a = -5.0; a <= 5.0; a += 0.3)
fprintf(fp," %6.3f %6.3f\n",
a, ((*P_f)(a)) );
fclose(fp);
}
/* ------------------------------ */
int main(void)
{
printf("f) Dans gnuplot -> plot \"data\" ");
Gplt(f);
getchar();
printf("g) Dans gnuplot -> plot \"data\" ");
Gplt(g);
printf("\n\n Press return to continue.\n");
getchar();
return 0;
}
Exemple numérique
modifier- Passer deux pointeurs de fonctions à une fonction.
Code source
modifier- Ici on passe les deux fonctions f et g à la fonction f1_o_f2().
- La même fonction peut calculer gof, fog et fof...
- On peut remarquer que les pointeurs de fonctions ont les mêmes types arguments que les fonctions qu’ils vont recevoir.
/* ------------------------------ */
#include <stdio.h>
#include <math.h>
/* ------------------------------ */
/* ------ Fonction f ------------ */
double f(double x){return( pow(x,2.));}
/* ------------------------------ */
char feq[] = "x**2";
/* ------------------------------ */
/* ------ Fonction g ------------ */
double g(double x){return(2.0*x + 3.0);}
/* ------------------------------ */
char geq[] = "2.0*x + 3.0";
/* ------------------------------ */
/* -Fonction fog (g suivie de f)-*/
double f1_o_f2(
double (*P_f1)(double x),/* Pointeur pour la première fonction */
double (*P_f2)(double x),/* Pointeur pour la deuxième fonction */
double a
)
{
return((*P_f1)( ((*P_f2)(a))) );
}
/* ------------------------------ */
/* ------------------------------ */
int main(void)
{
double a = 2.0;
printf(" f : x-> %s\n", feq);
printf(" g : x-> %s\n", geq);
printf(" \n\n");
printf(" f(g(%.0f)) = %6.1f\n", a, f1_o_f2(f,g,a));
printf(" g(f(%.0f)) = %6.1f\n", a, f1_o_f2(g,f,a));
printf(" f(f(%.0f)) = %6.1f\n", a, f1_o_f2(f,f,a));
printf("\n\n Press return to continue.\n");
getchar();
return 0;
}
Résultat ;
f : x-> x**2 g : x-> 2.0*x + 3.0 . . f(g(2)) = 49.0 g(f(2)) = 11.0 f(f(2)) = 16.0 . Press return to continue.