< Introduction au langage C
fin de la boite de navigation du chapitre


Exemple d'algorithme pour l’utilisation de pointeurs de fonctions


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.

Fin de l'exemple


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.

Fin de l'exemple


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.