Leçons de niveau 14

Introduction au langage C/Pointeurs de fonctions

Une page de Wikiversité.
Sauter à la navigation Sauter à la recherche
Début de la boite de navigation du chapitre
Pointeurs de fonctions
Icône de la faculté
Chapitre no 11
Leçon : Introduction au langage C
Chap. préc. :Pointeurs de fichiers
Chap. suiv. :Tableau de pointeurs de fonctions
fin de la boite de navigation du chapitre
Icon falscher Titel.svg
En raison de limitations techniques, la typographie souhaitable du titre, « Introduction au langage C : Pointeurs de fonctions
Introduction au langage C/Pointeurs de fonctions
 », n'a pu être restituée correctement ci-dessus.


Exemple d'algorithme pour l’utilisation de pointeurs de fonctions[modifier | modifier le wikicode]

Début de l'exemple
Fin de l'exemple



Début de l'exemple
Fin de l'exemple



Exemple graphique (avec Gnuplot)[modifier | modifier le wikicode]

  • Passer un pointeurs de fonctions à une fonction.

Code source[modifier | modifier le wikicode]

  • 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 | modifier le wikicode]

  • Passer deux pointeurs de fonctions à une fonction.

Code source[modifier | modifier le wikicode]

  • 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.