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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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