Probleme de segmentation

Probleme de segmentation - C - Programmation

Marsh Posté le 10-01-2006 à 17:44:50    

Bonjour,
 
j'aurais besoin d'aide car mon programme ne fonctionne pas .
 
Est ce que vous pourriez m'aider.
 
Merci  
 
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <ctype.h>
  4. #include <float.h>
  5. #include <string.h>
  6. enum Type
  7.   {
  8.     Operateur,
  9.     Constante,
  10.     Variable
  11.   };
  12. union Info 
  13. {
  14.   char *nom;
  15.   double cte;
  16.   char op;
  17. };
  18. typedef struct noeud{
  19.   enum Type type;
  20.   union Info info;
  21.   struct noeud *gauche;
  22.   struct noeud *droit;
  23. }Noeud,*Arbre;
  24. void espace (char **ligne)
  25. {
  26.   while(**ligne == ' ') (*ligne)++;
  27. }
  28. int EstDouble(char *ligne, double *val)
  29. {
  30.   double v;
  31.   char *endptr = NULL;
  32.   v = strtod(ligne,&endptr);
  33.  
  34.   /* la chaine ne contient pas que des chiffres */
  35.   if(*endptr != '\0')
  36.     {
  37.       fprintf(stderr,"le chiffre n'est pas correctement ecrit\n" );
  38.       return 1;
  39.     }
  40.  
  41.   /* verification si debordements */
  42.   if(v<=(-DBL_MAX) || v>=DBL_MAX)
  43.     {
  44.       fprintf(stderr,"debordement\n" );
  45.       return 1;
  46.     }
  47.  
  48.   /* on recupere la valeur */
  49.   *val = v;
  50.  
  51.   return 0;
  52. }
  53. /* Analyse d'une expression : creation de l'arbre */
  54. Arbre CreerArbre(char **ligne)
  55. {
  56.   double val;
  57.   char operateur;
  58.   char *chiffre;
  59.   char *nom;
  60.  
  61.   Arbre a = malloc(sizeof(Noeud));
  62.   if(a == NULL)
  63.     {
  64.       fprintf(stderr,"erreur allocation de l'arbre\n" );
  65.       return NULL;
  66.     }
  67.  
  68.   if(**ligne == '\0')
  69.     return NULL;
  70.   while(**ligne != '\0')
  71.     {
  72.       /* c'est un chiffre */
  73.       if(isdigit(**ligne))
  74. {
  75.   chiffre = *ligne;
  76.   int i = 0;
  77.   while(isdigit(**ligne) || **ligne =='.')
  78.     {
  79.       chiffre[i] = **ligne;
  80.       (*ligne)++;
  81.       i++;
  82.     }
  83.   chiffre[i] = '\0';
  84.  
  85.   if(**ligne != ' ' || **ligne != '\0')
  86.     return NULL;
  87.  
  88.   if(EstDouble(chiffre,&val))
  89.     {    
  90.       fprintf(stderr,"le chiffre : '%s' n'est pas correctement ecrit\n",chiffre);
  91.       return NULL;
  92.     }
  93.  
  94.   a->type = Constante;
  95.   a->info.cte = val;
  96.  
  97.   chiffre = NULL;
  98.   espace(ligne);
  99. }
  100.      
  101.       else
  102. {
  103.   /* c'est une lettre -> variable*/
  104.   if(isalpha(**ligne))
  105.     {
  106.       nom = *ligne;
  107.       int j = 0;
  108.       while(isalpha(**ligne))
  109.  {
  110.    nom[j] = **ligne;
  111.    (*ligne)++;
  112.    j++;
  113.  }
  114.       nom[j] = '\0';
  115.      
  116.       if(**ligne != ' ' || **ligne != '\0')
  117.  return NULL;
  118.      
  119.       a->type = Variable;
  120.       a->info.nom = malloc(strlen(nom)+1);
  121.       if(a->info.nom == NULL)
  122.  {
  123.    fprintf(stderr,"erreur allocation" );
  124.    return NULL;
  125.  }
  126.       strcpy(a->info.nom,nom);     
  127.      
  128.       nom = NULL;
  129.       espace(ligne);
  130.     }
  131.  
  132.   else
  133.     {
  134.       /* le caractere est un operateur */
  135.       operateur = *((*ligne)++);
  136.       if(operateur == '+' || operateur  == '-' ||
  137.   operateur == '*' || operateur == '/')
  138.  {
  139.    a->type = Operateur;
  140.    a->info.op = operateur;
  141.    a->gauche = CreerArbre(ligne);
  142.    a->droit = CreerArbre(ligne);
  143.  }
  144.      
  145.       else
  146.  {
  147.    if(operateur == '@' || operateur == '~')
  148.      {
  149.        a->type = Operateur;
  150.        a->info.op = operateur;
  151.        a->gauche = NULL;
  152.        a->droit = CreerArbre(ligne);
  153.      }
  154.   
  155.    else
  156.      printf("Erreur,'%c' n'est pas un operateur prevu\n",operateur);
  157.  }
  158.     }
  159. }
  160.     }
  161.   return a;
  162. }
  163. void Infixe(Arbre a)
  164. {
  165.  
  166.   switch(a->type)
  167.     {
  168.     case Constante:
  169.       printf("%f",a->info.cte);
  170.       break;
  171.      
  172.     case Variable:
  173.       printf("%s",a->info.nom);
  174.       break;
  175.      
  176.     case Operateur:
  177.       switch(a->info.op)
  178. {
  179.   case'+':
  180.     case'-':/* affichage infixe sans () */
  181.     Infixe(a->gauche);
  182.   if(a->info.op == '+') printf("+" );
  183.   else printf("-" );
  184.   Infixe(a->droit);
  185.   break;
  186.   case'*':
  187.     case'/':/* affichage infixe avec () */
  188.     if(a->gauche->type != Operateur)
  189.       Infixe(a->gauche);
  190.     else
  191.       {
  192.  printf("(" );
  193.  Infixe(a->gauche);
  194.  printf(" )" );
  195.       }
  196.   if(a->info.op == '*') printf("*" );
  197.   else printf("/" );
  198.  
  199.   if(a->droit->type != Operateur)
  200.     Infixe(a->droit);
  201.   else
  202.     {
  203.       printf("(" );
  204.       Infixe(a->droit);
  205.       printf(" )" );
  206.     }
  207.   break;
  208.   case'@':/* affichage prefixe */
  209.     printf("@" );
  210.   Infixe(a->gauche);
  211.   break;
  212.   case'~':
  213.     printf("~" );
  214.   Infixe(a->gauche);
  215.   break;
  216. }
  217.     }
  218. }
  219. int main(void)
  220. {
  221.   char *ligne = "+ * premier deuxieme 25";
  222.   Arbre a = CreerArbre(&ligne);
  223.   Infixe(a);
  224.   return 0;
  225. }


Reply

Marsh Posté le 10-01-2006 à 17:44:50   

Reply

Marsh Posté le 10-01-2006 à 17:50:29    

Commence par résoudre ceci :
 

"test.c", line 94: syntax error before or at: int
"test.c", line 97: undefined symbol: i
"test.c", line 101: undefined symbol: i
"test.c", line 125: syntax error before or at: int
"test.c", line 128: undefined symbol: j
"test.c", line 132: undefined symbol: j
"test.c", line 180: cannot recover from previous errors
cc: acomp failed for test.c


:o

Message cité 1 fois
Message édité par Elmoricq le 10-01-2006 à 17:53:58
Reply

Marsh Posté le 10-01-2006 à 18:02:08    

Elmoricq a écrit :

Commence par résoudre ceci :
 

"test.c", line 94: syntax error before or at: int
"test.c", line 97: undefined symbol: i
"test.c", line 101: undefined symbol: i
"test.c", line 125: syntax error before or at: int
"test.c", line 128: undefined symbol: j
"test.c", line 132: undefined symbol: j
"test.c", line 180: cannot recover from previous errors
cc: acomp failed for test.c


:o


Bonjour,
 
tu utilises quoi pour obtenir ces messages? car je ne les obtients pas en compilant avec :

gcc -Wall -ansi -g -Wwrite-strings test.c


 

"test.c", line 94: syntax error before or at: int
"test.c", line 97: undefined symbol: i
"test.c", line 101: undefined symbol: i
 
"test.c", line 128: undefined symbol: j
"test.c", line 132: undefined symbol: j
 
cc: acomp failed for test.c


J'ai verife et j'avais deja definit ,ces 2 variables
 

"test.c", line 125: syntax error before or at: int
"test.c", line 180: cannot recover from previous errors


Je ne comprends pas ces 2 lignes ?

Reply

Marsh Posté le 10-01-2006 à 20:36:37    

Bonjour,
mon probleme de segmentation vient de cette partie du code.
Est ce que vous pourriez m'indiquer comment modifier ce bout pour ne plus avoir de seg fault.
 
Merci d'avance
 

Code :
  1. chiffre = *ligne;
  2.   int i = 0;
  3.   while(isdigit(**ligne) || **ligne =='.')
  4.     {
  5.       chiffre[i] = **ligne;
  6.       (*ligne)++;
  7.       i++;
  8.     }
  9.   chiffre[i] = '\0';


Message édité par Gattuso le 10-01-2006 à 20:37:56
Reply

Marsh Posté le 11-01-2006 à 00:03:38    

ligne est une chaîne non modifiable.
 
Je crois te l'avoir déjà dit dans un de tes posts. [:klem3i1]


Message édité par Elmoricq le 11-01-2006 à 00:04:05
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed