« Programmation C/Pointeurs » : différence entre les versions

Contenu supprimé Contenu ajouté
Aucun résumé des modifications
Aucun résumé des modifications
Ligne 568 :
 
</source>
 
 
 
== Un tableau de pointeurs de fonctions ==
 
=== Introduction ===
 
Nous avons des fonctions semblables. Nous voulons les associer pour pouvoir les manipuler dans des boucles.
 
 
Nous allons créer un '''tableau de pointeurs de fonctions'''.
 
 
Je vais utiliser les fonctions trigonométriques prédéfinies pour faciliter la lecture.
 
=== Premier exemple ===
 
==== Un tableau de pointeurs de fonctions ====
 
<source lang="c">
double (*TrigF[6])(double x) = {cos,sin,tan,atan,asin,acos};
</source>
 
* Toutes les fonctions ont la même forme.
* double FUNCTION(double)
* Le tableau à la même forme que les fonctions.
* double ARRAY(double)
* Il y a six fonctions. (0,1,2,3,4,5)= {cos,sin,tan,atan,asin,acos}.
 
==== Exemple d'un appel ====
 
<source lang="c">
cos(.5) = TrigF[0](.5)
</source>
 
=== Exemple à tester ===
<source lang="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;
}
</source>
 
 
<source lang="c">
</source>
 
 
=== Application ===
 
* Créer un tableau de valeurs des fonctions trigonométriques.
* Imprimer le résultat dans cette ordre (sin,cos,tan,acos,asin,atan)
* Pour .1 <= x <+ .5
* Ce travail pourrait être récupéré dans une matrice.
 
==== Résultat dans un fichier ====
<source lang="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;
}
</source>
 
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
 
Remarque :
* Attention à l'ordre des fonctions dans la déclaration du tableau.
* double (*TrigF[6])(double x) = {'''atan,asin,acos,tan,cos,sin'''};
 
Au démarage :
* 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 résultat à l'écran ====
 
<source lang="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;
}