Question d'ecriture ?

Question d'ecriture ? - C - Programmation

Marsh Posté le 10-01-2006 à 21:35:24    

Voici le code complet que j'avais poste:
http://forum.hardware.fr/hardwaref [...] 2860-1.htm
 
Bonjour,
en remplaçant cette partie du code par la suivante,je n'obtiens plus de seg fault.
Est ce que quelqu'un pourrait me dire pour quelle raison cela fonctionne dans un cas et pas dans l'autre.
 
Merci
 

Code :
  1. Arbre CreerArbre(char **ligne)
  2. {
  3.   double val;
  4.   char operateur;
  5.   char *chiffre;
  6.   char *nom;
  7.  
  8.   Arbre a = malloc(sizeof(Noeud));
  9.   if(a == NULL)
  10.     {
  11.       fprintf(stderr,"erreur allocation de l'arbre\n" );
  12.       return NULL;
  13.     }
  14.  
  15.   while(**ligne != '\0')
  16.     {
  17.       /* c'est un chiffre */
  18.       if(isdigit(**ligne))
  19. {
  20.   chiffre = *ligne;
  21.   int i = 0;
  22.   while(isdigit(**ligne) || **ligne =='.')
  23.     {
  24.       chiffre[i] = **ligne;
  25.       (*ligne)++;
  26.       i++;
  27.     }
  28.   chiffre[i] = '\0';
  29.   <...>
  30. }


 
 

Code :
  1. Arbre CreerArbre(char **ligne)
  2. {
  3.   double val;
  4.   char operateur;
  5.   char chiffre[];
  6.   char *nom;
  7.  
  8.   Arbre a = malloc(sizeof(Noeud));
  9.   if(a == NULL)
  10.     {
  11.       fprintf(stderr,"erreur allocation de l'arbre\n" );
  12.       return NULL;
  13.     }
  14.  
  15.   while((*ligne)[0] != '\0')
  16.     {
  17.        int i = 0;
  18.       /* c'est un chiffre */
  19.       if(isdigit((*ligne)[0])
  20.            {
  21.   while(isdigit((*ligne)[0] || (*ligne)[0] =='.')
  22.     {
  23.       chiffre[i] = (*ligne)[0];
  24.       (*ligne)++;
  25.       i++;
  26.     }
  27.   chiffre[i] = '\0';
  28.   <...>
  29. }

Reply

Marsh Posté le 10-01-2006 à 21:35:24   

Reply

Marsh Posté le 11-01-2006 à 01:23:41    

Gattuso a écrit :

Voici le code complet que j'avais poste:
http://forum.hardware.fr/hardwaref [...] 2860-1.htm
 
Bonjour,
en remplaçant cette partie du code par la suivante,je n'obtiens plus de seg fault.
Est ce que quelqu'un pourrait me dire pour quelle raison cela fonctionne dans un cas et pas dans l'autre.
 
Merci
 

Code :
  1. Arbre CreerArbre(char **ligne)
  2. {
  3.   double val;
  4.   char operateur;
  5.   char *chiffre;
  6.   char *nom;
  7.  
  8.   Arbre a = malloc(sizeof(Noeud));
  9.   if(a == NULL)
  10.     {
  11.       fprintf(stderr,"erreur allocation de l'arbre\n" );
  12.       return NULL;
  13.     }
  14.  
  15.   while(**ligne != '\0')
  16.     {
  17.       /* c'est un chiffre */
  18.       if(isdigit(**ligne))
  19. {
  20.   chiffre = *ligne;
  21.   int i = 0;
  22.   while(isdigit(**ligne) || **ligne =='.')
  23.     {
  24.       chiffre[i] = **ligne;
  25.       (*ligne)++;
  26.       i++;
  27.     }
  28.   chiffre[i] = '\0';
  29.   <...>
  30. }


 
 

Code :
  1. Arbre CreerArbre(char **ligne)
  2. {
  3.   double val;
  4.   char operateur;
  5.   char chiffre[];
  6.   char *nom;
  7.  
  8.   Arbre a = malloc(sizeof(Noeud));
  9.   if(a == NULL)
  10.     {
  11.       fprintf(stderr,"erreur allocation de l'arbre\n" );
  12.       return NULL;
  13.     }
  14.  
  15.   while((*ligne)[0] != '\0')
  16.     {
  17.        int i = 0;
  18.       /* c'est un chiffre */
  19.       if(isdigit((*ligne)[0])
  20.            {
  21.   while(isdigit((*ligne)[0] || (*ligne)[0] =='.')
  22.     {
  23.       chiffre[i] = (*ligne)[0];
  24.       (*ligne)++;
  25.       i++;
  26.     }
  27.   chiffre[i] = '\0';
  28.   <...>
  29. }



 
Ben déjà, tant que tu réserveras pas de place pour stocker tes chiffres dans ton pointeur "chiffre" tu obtiendras un comportement indéterminé
 
En revanche, tel que je vois ton algo, il va merder si tu lui passes un truc de ce style "123.456.789" à cause du "while (isdigit(**ligne) || **ligne == '.')"
 
De plus, il ne donnera rien si tu lui passes ".123" à cause du premier "if (isdigit(**ligne))"
 
Pourquoi tu réinventes la roue alors que tu as "strtof()" =>

Code :
  1. sprintf(chiffre, "%f", strtof(ligne[0], NULL))



---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 11-01-2006 à 06:47:56    

Sve@r a écrit :

Ben déjà, tant que tu réserveras pas de place pour stocker tes chiffres dans ton pointeur "chiffre" tu obtiendras un comportement indéterminé
 
En revanche, tel que je vois ton algo, il va merder si tu lui passes un truc de ce style "123.456.789" à cause du "while (isdigit(**ligne) || **ligne == '.')"
 
 
De plus, il ne donnera rien si tu lui passes ".123" à cause du premier "if (isdigit(**ligne))"
 
Pourquoi tu réinventes la roue alors que tu as "strtof()" =>

Code :
  1. sprintf(chiffre, "%f", strtof(ligne[0], NULL))



En utilisant le sprintf,je n'aurais pas besoin de faire comme j'avais fait mais comment est ce que je fait ensuite pour faire avancer **ligne.
Par exemple si j'ai :
12.257 mot
j'analyse 12.257 qui est correctement ecrit et après cette analyse,je souhaite que *ligne pointe sur mot  

Reply

Marsh Posté le 11-01-2006 à 08:48:26    

Sve@r a écrit :


Pourquoi tu réinventes la roue alors que tu as "strtof()" =>

Code :
  1. sprintf(chiffre, "%f", strtof(ligne[0], NULL))



strtof() est C99. Je recommande plutôt strtod() qui est plus portable et qui incite à utiliser les double au profit des float, ce qui est une Bonne Chose ©


Message édité par Emmanuel Delahaye le 11-01-2006 à 08:50:56

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 15-01-2006 à 12:42:18    

Gattuso a écrit :

En utilisant le sprintf,je n'aurais pas besoin de faire comme j'avais fait mais comment est ce que je fait ensuite pour faire avancer **ligne.
Par exemple si j'ai :
12.257 mot
j'analyse 12.257 qui est correctement ecrit et après cette analyse,je souhaite que *ligne pointe sur mot


 
Avec "while (strtok())" tu peux faire pointer un pointeur sur chaque mot de ta ligne


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Sujets relatifs:

Leave a Replay

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