Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1020 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Question d'ecriture ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Question d'ecriture ?

n°1280953
Gattuso
Posté le 10-01-2006 à 21:35:24  profilanswer
 

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. }

mood
Publicité
Posté le 10-01-2006 à 21:35:24  profilanswer
 

n°1281056
Sve@r
Posté le 11-01-2006 à 01:23:41  profilanswer
 

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.
n°1281078
Gattuso
Posté le 11-01-2006 à 06:47:56  profilanswer
 

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  

n°1281103
Emmanuel D​elahaye
C is a sharp tool
Posté le 11-01-2006 à 08:48:26  profilanswer
 

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/
n°1283889
Sve@r
Posté le 15-01-2006 à 12:42:18  profilanswer
 

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.

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Question d'ecriture ?

 

Sujets relatifs
Question sur HTTP_USER_AGENTQuestion de débutant
Question de n00b :-)Question débutant php
question VB[Access] Petite question sur interaction Access/Excel
[PHP] Droits d'écriture dans un dossier créé avec mkdir() ?Ecriture dans un fichier
Problème d'écriture XML[SQL / ACCESS] question un peu tordu sur une requete.
Plus de sujets relatifs à : Question d'ecriture ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR