Toujours est-il que ça ne permet pas d´écrire ça :
tracer((math_call*)&my_square, 0, 3.14, 1 );
Evidement: my_square et &my_square sont equivalent. Pourquoi? Car my_square est un pointeur sur une fonction (un nombre si on veut simplifier). On ne peut pas ecrire par ex int *a = &5; donc par defaut les compilo considere que &fonction correspond a fonction.
Comment remedier a ca? Tout simplement comme pour un int, en stockant le nombre qq part:
int a_valeur = 5;
int *a = &a_valeur;
cf mon exemple que j´ai paste plus bas.
disons que les tableaux de fonctions tels que tu le
souhaiterai n´est pas vraiment possible ...
Si, c´est totalement possible.
Ton explication est fausse, une fonction etant toujours representee par un pointeur.
Dans mon exemple je montre que l´on peut caster une fonction en un void* et de nouveau en une fonction. Je montre egalement que l´on peut parcourir un tableau de fonctions.
Le code: (http://rafb.net/paste/results/GWdYEN27.html)
- include <stdio.h>
- include <math.h>
typedef double (*math_call)(double);
void tracer( math_call f, double xmin, double xmax, double increment )
{
double x;
for( x = xmin; x <= xmax; x += increment )
{
double valeur = f( x );
printf( "%lf : %lf\n", x, valeur );
}
}
void tracer_all( math_call *functions, double xmin, double xmax, double increment )
{
while( *functions )
{
tracer( *functions++, xmin, xmax, increment );
}
}
void tracer_premier( math_call *functions, double xmin, double xmax, double increment )
{
tracer( *functions, xmin, xmax, increment );
}
double my_square( double nombre )
{
return nombre * nombre;
}
double my_test( double nombre, int a )
{
return my_square( nombre );
}
int main()
{
math_call myCos = cos;
math_call mySin = sin;
math_call mySquare = my_square;
math_call funcs_1[] = { myCos, mySin, 0L };
void *tmp = (void*) cos;
math_call myCos2 = (math_call) tmp;
tracer( mySquare, 0, 5, 1 );
tracer( myCos, 0, 3.14, 1 );
tracer_all( funcs_1, 0, 3.14, 1 );
tracer_premier( funcs_1, 0, 3.14, 1 );
tracer_premier( &myCos, 0, 3.14, 1 );
tracer( my_test, 0, 3.14, 1 ); // warning, normal, mais ca marche toujours
tracer( myCos2, 0, 3.14, 1 ); // ca marche
return 0;
}