Leçons de niveau 14

C pointeurs/Tableau de pointeurs de fonctions

Une page de Wikiversité.
Sauter à la navigation Sauter à la recherche
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
Icon falscher Titel.svg
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 | modifier le wikicode]

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

Les fonctions trigonométriques[modifier | modifier le wikicode]

Nous allons utiliser les fonctions trigonométriques du C.


Déclaration du tableau[modifier | modifier le wikicode]

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

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


Exemple à tester[modifier | modifier le wikicode]

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

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

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

  • 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;
}