C pointeurs/Tableau de pointeurs de fonctions

Début de la boite de navigation du chapitre
Tableau de pointeurs de fonctions
Icône de la faculté
Chapitre no 3
Leçon : C pointeurs
Chap. préc. :Pointeurs de fonctions
Chap. suiv. :Tableau de pointeurs de fonctions 2
fin de la boite de navigation du chapitre
En raison de limitations techniques, la typographie souhaitable du titre, « C pointeurs : Tableau de pointeurs de fonctions
C pointeurs/Tableau de pointeurs de fonctions
 », n'a pu être restituée correctement ci-dessus.


Introduction modifier

  • Nous avons des fonctions de mêmes prototypes.
  • Nous voulons les associer pour pouvoir les manipuler dans des boucles.
  • Nous allons créer un tableau de pointeurs de fonctions.
  • Le tableau de pointeurs de fonctions doit être déclaré avec un prototype de la même forme que celui des fonctions.


Tableau de pointeurs de fonctions modifier

Les fonctions trigonométriques modifier

Nous allons utiliser les fonctions trigonométriques du C.


Déclaration du tableau modifier

double (*TrigF[6])(double x) = {cos,sin,tan,atan,asin,acos};
  • Toutes les fonctions ont la même forme : double fonction(double).
  • Le tableau à la même forme que les fonctions : double tableau(double).
  • Il y a six fonctions : cos, sin, tan, atan, asin, acos.


Exemple d'un appel modifier

   cos(.5) == TrigF[0](.5)


Exemple à tester modifier

/* ------------------------------ */
/* Save as c01.c                  */
/* ------------------------------ */
#include    <stdio.h>
#include     <math.h>
/* ------------------------------ */
int main(void)
{
double (*TrigF[6])(double x) = {cos,sin,tan,atan,asin,acos};

double x= .5;
int    i=  0;

 printf(" Nous avons declare un tableau "
        " de pointeurs de fonctions.\n  "
        " J’ai utilise ici les fonctions predefinie du c.\n");

  
  printf("       cos(%.1f)  = %.3f  \n",  x,     cos(x));
  printf(" TrigF[%d](%.1f)) = %.3f\n\n",i,x,TrigF[i](x));

 printf(" Press return to continue");
 getchar();

 return 0;
}


Application modifier

  • Créer un tableau de valeurs des fonctions trigonométriques.
  • Imprimer le résultat dans cet ordre (sin,cos,tan,acos,asin,atan)
  • Pour .1 <= x <+ .5


Avec le résultat à l'écran modifier

/* ------------------------------ */
/* Save as c03.c                  */
/* ------------------------------ */
#include    <stdio.h>
#include     <math.h>
/* ------------------------------ */
int main(void)
{
double (*TrigF[6])(double x) = {atan,asin,acos,tan,cos,sin};

int    i= 6;
double x= .1;

     for(;x<=.5;x+=.1)
       {
         printf("\n");
         for(i=6;i;) printf(" %.3f ",TrigF[--i](x));
       }

 printf("\n\n Press return to continue.\n");
 getchar();

 return 0;
}


Le résultat :

  x || sin    cos    tan    acos   asin   atan 
0.1 || 0.100  0.995  0.100  1.471  0.100  0.100 
0.2 || 0.199  0.980  0.203  1.369  0.201  0.197 
0.3 || 0.296  0.955  0.309  1.266  0.305  0.291 
0.4 || 0.389  0.921  0.423  1.159  0.412  0.381 
0.5 || 0.479  0.878  0.546  1.047  0.524  0.464 


Remarques :

  • Attention à l’ordre des fonctions dans la déclaration du tableau.
  • double (*TrigF[6])(double x) = {atan,asin,acos,tan,cos,sin};


Au démarrage :

  • La décrémentation ce fait dans le tableau. TrigF[--i](x)
  • Il entre 6 dans le tableau.
  • 6 est décrémenté → 5 (avant l'appel de la fonction --i)
  • La sixième fonctions est appelé (Sin).
  • La numéro cinq. :)


Au final :

  • Il entre UN dans le tableau.
  • UN est décrémenté → 0
  • La première fonctions est appelé (atan).
  • La numéro zéro. :))
  • i est égal à zéro en rentrant dans la boucle.
  • Le cycle est cassé. :(


Avec le résultat dans un fichier modifier

  • Déclarer le pointeur de fichiers.
    • FILE *fp;
  • Ouvrir le fichier.
    • fp = fopen("list.txt","w");
  • Fermer le fichiers
    • fclose(fp);
  • Remplacer tous les printf( par fprintf(fp,
    • fprintf(fp,


/* ------------------------------ */
/* Save as c02.c                  */
/* ------------------------------ */
#include    <stdio.h>
#include     <math.h>
/* ------------------------------ */
int main(void)
{
FILE   *fp = fopen("list.txt","w");

double (*TrigF[6])(double x) = {atan,asin,acos,tan,cos,sin};

int    i= 6; 
double x= .1;

fprintf(fp,"   x || sin    cos    tan    acos   asin   atan \n");

     for(;x<=.5;x+=.1)
        {
         fprintf(fp," %.1f ||",x);
         for(i=6;i;)
            fprintf(fp," %.3f ",TrigF[--i](x));
         fprintf(fp,"\n");
        }

 fclose(fp);

 printf("\n\n Ouvrir le fichier list.txt\n");
 getchar();

 return 0;
}