Tableau de pointeur de fonction
Bonjour,
je dois modifier le code suivant et utiliser un tableau de fonction utilisant les operations arithmetiques élémentaires et verifiés les débordements éventuels.
Code de départ
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| double eval(Arbre *a)
{
double r1,r2;
if((*a)->type == Constante)
return ((*a)->info.cte)
if((*a)->type == Operateur)
{
r1=eval(&((*a)->gauche));
r2= eval(&((*a)->droit));
switch ((*a)->info.op)
{
case '+':return(r1+r2);
case '-':return(r1-r2);
case '*':return(r1*r2);
case '/':return(r1/r2);
}
}
/* si aucun return n'a été effectué jusqu'ici*/
puts("erreur (code opératoire inconnu par exemple)");
return(0);
} |
Code de la fonction plus,les autres sont de la meme forme
Code:
1 2 3 4 5 6 7 8
| double plus(double a, double b)
{
double res = a+b;
if(res<=(-DBL_MAX) || res >= DBL_MAX)
return DBL_MAX;
return res;
} |
code modifié:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| double eval(Arbre *a)
{
char tab1[] = {'+','-','/','*','\0'};
char (*tab2[])(double,double) = {plus,moins,div,mul,NULL};
double r1,r2;
if((*a)->type == Constante)
return ((*a)->info.cte)
if((*a)->type == Operateur)
{
r1=eval(&((*a)->gauche));
r2= eval(&((*a)->droit));
int i;
for(i=0; tab1[i] != '\0' && tab1[i] != (*a)->info.op; i++)
;
if(tab1[i] == '\0')
{
printf("erreur\n");
return DBL_MAX
}
if((*tab2[i])(r1,r2) ==DBL_MAX)
{
printf("debordement\n");
return DBL_MAX
}
/* si aucun return n'a été effectué jusqu'ici*/
puts("erreur (code opératoire inconnu par exemple)");
return(0);
} |
Pouvez vous m'indiquez si cette manière de faire est correcte.
Merci d'avance