Se connecter / S'enregistrer
Votre question

Porbleme avec des string dans une struct....

Tags :
  • Tip top
  • Programmation
Dernière réponse : dans Programmation
28 Novembre 2006 17:13:56

Bonojur bonjour,
alors voila j'ai défini une structure de iste doublement chainée qui me permet de traiter des fichiers selon trois critères : le numéro d'inode , le nombre de liens durs et symboliques et le chemin vers ce fichier, voila le code de la struct :

  1. typedef struct listeFichier{
  2. int numInode;
  3. int nbLiens;
  4. string chemin;
  5. struct listeFichier *suivant;
  6. struct listeFichier *precedent;
  7. };


j'ai défini une fonction qui prend trois parametres en arguments permettant d'ajouter un fichier a la liste :

  1. void ajoutFichier(int numI,int nbL,string chemF)
  2. {if(tete==NULL) //cas pour lequel la liste est vide
  3. {
  4. struct listeFichier *nouveau;
  5. nouveau = (listeFichier*)malloc(sizeof(struct listeFichier));
  6. nouveau->suivant=tete;
  7. nouveau->precedent=NULL;
  8. nouveau->numInode=numI;
  9. nouveau->nbLiens=nbL;
  10. nouveau->chemin=chemF; //probelme ici !! : erreur de segmentation
  11. tete=nouveau;
  12. }
  13. else //quand la liste n'est pas vide
  14. {
  15. struct listeFichier *nouveau;
  16. nouveau = (listeFichier*)malloc(sizeof(struct listeFichier));
  17. nouveau->suivant=tete;
  18. tete->precedent=nouveau;
  19. nouveau->precedent=NULL;
  20. nouveau->numInode=numI;
  21. nouveau->nbLiens=nbL;
  22. nouveau->chemin=chemF; //probelme ici !! : erreur de segmentation
  23. tete=nouveau;
  24. }
  25. }


le probleme c'est que j'ai une erreur de segmentation quand j'affecte chemF à nouveau->cemin,
et je ne vois pas pourquoi, vous avez des idées ?

Autres pages sur : porbleme string struct

28 Novembre 2006 17:20:10

c'est du C ?
string, ça existe comme type ?
28 Novembre 2006 17:32:48

si tu utilise std::string, c'est du C++, c'est une classe.
la différence entre malloc/calloc et new est que new appelle les constructeurs pour les classes, ce que malloc/calloc ne font pas.
donc à la suite d'un malloc sur une structure contenant un string, la mémoire est alloué mais le constructeur n'est pas appelé, ce qui engendre un comportement indéfini.
modifie ta structure en classe en ajoutant un constructeur et un destructeur et utilises l'opérateur new
28 Novembre 2006 17:33:12

bah c'est un mix de C et C++ en fait, a priori les struct sont compatibles C++, dans ce cas c'étati plus simple que de faire une classe ...
28 Novembre 2006 17:34:58

argh, non je peux pas faire ca, j'ai deja pas mal galéré a essayer de faire une classe, la c'est vachement plus simple et je pense pas que la crétion d'une classe soit justifiée. en plus c'st pour un tp noté que j'ai à rendre demai alors ...
peut etre en utilisant les char * ?
28 Novembre 2006 17:36:04

ah merde, c'est vrai que ya du string en c++.
mais il me semble que c'est pas tip/top de mélanger C et C++...
28 Novembre 2006 17:38:39

j'ai une idée :
est ce que si je défini chemin comme un char * je peux lui donner ensuite la taille que je veux dans la fonction ajouterFichier ?
28 Novembre 2006 17:41:03

oui
mais fait gaffe à la modification de sa valeur (si elle dépasse)

mais c'est encore mieux d'utiliser new avec des classes
28 Novembre 2006 17:54:17

ouais mais la j'ai quasiment fini, j'ai trouvé un bon tuto sur la conversion de string en char* donc je pense que ca va aller. merci pour votre aide en tout cas !
28 Novembre 2006 17:58:38

tu peux également modifier ta structure comme suit :
  1. typedef struct listeFichier{
  2. int numInode;
  3. int nbLiens;
  4. string* chemin;
  5. struct listeFichier *suivant;
  6. struct listeFichier *precedent;
  7. };


puis dans ton code
  1. nouveau->chemin=new string(chemF);

28 Novembre 2006 18:01:35

okay je vais essayer ca dessuite !!
edit : c'est bon je viens de faire la modif et ca marche, pas d'erreur de segmentation en vue merci beaucoup !
28 Novembre 2006 18:08:59

oovaton a dit :
bah c'est un mix de C et C++ en fait, a priori les struct sont compatibles C++, dans ce cas c'étati plus simple que de faire une classe ...


[Mode pointdevue="on"]
Personnellement, je suis contre cette pratique, le C et le C++ sont deux langages distincts donc on utilise soit l'un soit l'autre. Si tu fais du C, tu peux utiliser un char * sinon tu utilises ta string en C++. En clair, soit on utilise les types et fonctions de la libC, soit ceux de la STL mais pas les deux en meme temps
[Mode pointdevue="off"]

Sinon, un conseil, quand tu malloc, pense à vérifier le retour histoire que si ça échoue, tout ne plante pas ;) 
28 Novembre 2006 22:00:25

mince en fait ca ne marche pas, ca pase à la compilation mais une fois que j'essai d'afficher ça me sors une adresse mémoire ...grrr
bon je vais essayer avec un char *.
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS