< Introduction au langage C
![](../../I/Oxygen480-apps-preferences-desktop-icons.svg.png.webp)
![](../../I/Oxygen480-apps-preferences-desktop-icons.svg.png.webp)
Exemple d'algorithme pour l’utilisation de pointeurs de fonctions
![](../../I/Oxygen480-apps-preferences-desktop-icons.svg.png.webp)
Exemple 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.
![](../../I/Oxygen480-apps-preferences-desktop-icons.svg.png.webp)
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)
- Passer un pointeurs de fonctions à une fonction.
Code source
- 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
- Passer deux pointeurs de fonctions à une fonction.
Code source
- 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.
Cet article est issu de Wikiversity. Le texte est sous licence Creative Commons - Attribution - Partage dans les Mêmes. Des conditions supplémentaires peuvent s'appliquer aux fichiers multimédias.