C pointeurs/Tableau de pointeurs de fonctions
Apparence
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;
}