[C] probleme de structure

probleme de structure [C] - C++ - Programmation

Marsh Posté le 20-10-2002 à 16:49:03    

hello world :hello:
 
G un gros probleme:

Code :
  1. #ifndef ABR_H
  2. #define ABR_H
  3. typedef struct{
  4.    int val;
  5.    noeud *gauche;
  6.    noeud *droit;
  7.    noeud *pere;
  8.     }noeud;
  9.    
  10. void afficherDansOrdre(noeud *);
  11. noeud * rechercherMax(noeud *);
  12. #endif


 
dans mon main() je déclare plusieurs noeud n1,n2......et je les initialisent.....
Oui mais le compilateur (gcc) il aime pas du tout:
In file included from abr.c:2:
abr.h:6: parse error before `noeud'

 

Code :
  1. main()
  2. {
  3. noeud n8;
  4. n8.droit = NULL;
  5. n8.gauche = NULL;
  6. n8.val = 22;
  7. noeud n7;
  8. n7.droit = &n8;
  9. n7.gauche = NULL;
  10. n7.val = 15;
  11. noeud n6;
  12. n6.droit = NULL;
  13. n6.gauche = NULL;
  14. n6.val = 9;
  15. noeud n5;
  16. n5.droit = NULL;
  17. n5.gauche = NULL;
  18. n5.val = 6;
  19. noeud n4;
  20. n4.droit = &n5;
  21. n4.gauche = &n6;
  22. n4.val = 8;
  23. noeud n3;
  24. n3.droit = &n7;
  25. n3.gauche = &n4;
  26. n3.val = 10;
  27. noeud n2;
  28. n2.droit = NULL;
  29. n2.gauche = NULL;
  30. n2.val = 3;
  31. noeud n1;
  32. n1.droit = &n3;
  33. n1.gauche = &n2;
  34. n1.val = 5;
  35. n1.pere = NULL;
  36. n2.pere = &n1;
  37. n3.pere = &n1;
  38. n4.pere = &n3;
  39. n5.pere = &n4;
  40. n6.pere = &n4;
  41. n7.pere = &n3;
  42. n8.pere = &n7;
  43. noeud *racine = &n1;
  44. noeud *max = rechercherMax(racine);
  45. printf("Max: %d\n",max->val);
  46. }


 
quelqu'un a une idée ???
Merci d'avance  :)


Message édité par Tricky le 20-10-2002 à 16:56:34
Reply

Marsh Posté le 20-10-2002 à 16:49:03   

Reply

Marsh Posté le 20-10-2002 à 16:51:08    

peut etre que si tu postais le main(), on pourrait t'aider un peu plus....


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 20-10-2002 à 16:51:59    

Code :
  1. typedef struct noeud{
  2.         int val;
  3.         noeud *gauche;
  4.         noeud *droit;
  5.         noeud *pere;
  6.        }noeud;


 
peut etre ?

Reply

Marsh Posté le 20-10-2002 à 16:52:00    

Sinon, essaie ceci :
 

Code :
  1. typedef struct noeud{
  2.         int val;
  3.         noeud *gauche;
  4.         noeud *droit;
  5.         noeud *pere;
  6.        };


 
Edit : grilled d'une seconde !!!  :fou:  
Mais peut être pas :
chrisbk> notre ami a dit qu'il déclarait noeud dans son main, et toi tu le déclares dans le .h
donc j'ai plus raison que toi  :sol:


Message édité par Harkonnen le 20-10-2002 à 16:53:42

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 20-10-2002 à 16:53:01    

Harkonnen a écrit a écrit :

Sinon, essaie ceci :
 

Code :
  1. typedef struct noeud{
  2.         int val;
  3.         noeud *gauche;
  4.         noeud *droit;
  5.         noeud *pere;
  6.        };






 
tu es rapide cowboy, mais encore assez :sol: :D

Reply

Marsh Posté le 20-10-2002 à 16:54:16    

chrisbk a écrit a écrit :

 
 
tu es rapide cowboy, mais encore assez :sol: :D




j'ai édité ;)


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 20-10-2002 à 16:56:24    

Bah je fais que renommer la struct comme toi au debut, sauf que j'ai laissé le nom a la fin (aucune idée a quoi il sert celui la, quand je nomme au début, alors bon, je laisse....)

Reply

Marsh Posté le 20-10-2002 à 16:58:58    

g rajouté le main()  :)  
g éssayé les propositions d'harkonnen & chrisbk mais sa change rien  :cry:  
Sa serait pas parce que ma structure contient un pointeur vers une structure du meme type ??

Reply

Marsh Posté le 20-10-2002 à 17:12:01    

normal :O
 
t en C, tu fais deja les declarations, ensuite le code :O
 
(et oublie pas le #include "arbre.h" )

Reply

Marsh Posté le 20-10-2002 à 17:28:33    

chrisbk a écrit a écrit :

normal :O
 
t en C, tu fais deja les declarations, ensuite le code :O
 
(et oublie pas le #include "arbre.h" )




 
Euhh la je vois pas trop ce que tu veux dire!
P.S: J'avais mis l'include.

Reply

Marsh Posté le 20-10-2002 à 17:28:33   

Reply

Marsh Posté le 20-10-2002 à 17:35:23    

tricky a écrit a écrit :

hello world :hello:

Code :
  1. main()
  2. {
  3. /* declarations au debut */
  4. noeud n8,n7,n6,n5,n4,n3,n2,n1;
  5. /* suite de tes affectations */
  6. n8.droit = NULL;
  7. n8.gauche = NULL;
  8. n8.val = 22;
  9. n7.droit = &n8;
  10. n7.gauche = NULL;
  11. n7.val = 15;
  12. n6.droit = NULL;
  13. n6.gauche = NULL;
  14. n6.val = 9;
  15. n5.droit = NULL;
  16. n5.gauche = NULL;
  17. n5.val = 6;
  18. n4.droit = &n5;
  19. n4.gauche = &n6;
  20. n4.val = 8;
  21. n3.droit = &n7;
  22. n3.gauche = &n4;
  23. n3.val = 10;
  24. n2.droit = NULL;
  25. n2.gauche = NULL;
  26. n2.val = 3;
  27. n1.droit = &n3;
  28. n1.gauche = &n2;
  29. n1.val = 5;
  30. n1.pere = NULL;
  31. n2.pere = &n1;
  32. n3.pere = &n1;
  33. n4.pere = &n3;
  34. n5.pere = &n4;
  35. n6.pere = &n4;
  36. n7.pere = &n3;
  37. n8.pere = &n7;
  38. noeud *racine = &n1;
  39. noeud *max = rechercherMax(racine);
  40. printf("Max: %d\n",max->val);
  41. }


 
Ca ira mieux a mon avis




Message édité par nicolasm le 20-10-2002 à 17:37:00
Reply

Marsh Posté le 20-10-2002 à 17:38:44    

nop sa change rien  :sweat:
D'apres le compilateur, le probleme vient du .h
 

In file included from abr.c:2:
abr.h:6: parse error before `noeud'

Reply

Marsh Posté le 20-10-2002 à 17:44:07    

C'est une structure autoréférentielle !!!
Vire le typedef :
 

Code :
  1. #ifndef ABR_H
  2. #define ABR_H
  3.  
  4. struct noeud {
  5.         int val;
  6.         noeud *gauche;
  7.         noeud *droit;
  8.         noeud *pere;
  9. };
  10.        
  11. void afficherDansOrdre(noeud *);
  12. noeud * rechercherMax(noeud *);
  13.  
  14. #endif


Message édité par Harkonnen le 20-10-2002 à 17:44:54

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 20-10-2002 à 17:48:40    

Code :
  1. typedef struct _noeud
  2. {
  3.         int val;
  4.         _noeud *gauche;
  5.         _noeud *droit;
  6.         _noeud *pere;
  7. } noeud;


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 20-10-2002 à 18:03:25    

:cry:  :cry:  :cry:  :cry:  :cry:  
G éssayé les soluces d'harkonnen et taz@ppc mais sa change rien ! :ouch: Y a pas de mot clef a mettre quand on utilise une structure "autoreferentielle" ??

Reply

Marsh Posté le 20-10-2002 à 18:21:41    

daisolai, movaise habitude de C++
 

Code :
  1. typedef struct _noeud
  2.   { 
  3.             int val; 
  4.             struct _noeud *gauche;
  5.             struct _noeud *droit;
  6.             struct _noeud *pere;
  7.   } noeud;


Message édité par Taz@PPC le 20-10-2002 à 18:21:55

---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 20-10-2002 à 18:23:55    

Taz@PPC a écrit a écrit :

daisolai, movaise habitude de C++
 

Code :
  1. typedef struct _noeud
  2.   { 
  3.             int val; 
  4.             struct _noeud *gauche;
  5.             struct _noeud *droit;
  6.             struct _noeud *pere;
  7.   } noeud;






putain, c'était ça effectivement !!
moi aussi je me plaçais dans une optique C++ et j'ai pas percuté !  :fou:


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 20-10-2002 à 18:30:14    

Merci taz@ppc sa fonctionne deja mieu!! (plus d'erreurs dans le .h)
Par contre apparement il n'aime pas les déclarations de ce type:

Code :
  1. noeud n7;
  2. n7.val = 9;
  3. .......


 
le compilateur me dit:
abr.c: In function `main':
abr.c:152: parse error before `n7'
abr.c:153: `n7' undeclared (first use in this function)


Message édité par Tricky le 20-10-2002 à 18:30:47
Reply

Marsh Posté le 20-10-2002 à 18:35:39    

tricky a écrit a écrit :

Merci taz@ppc sa fonctionne deja mieu!! (plus d'erreurs dans le .h)
Par contre apparement il n'aime pas les déclarations de ce type:

Code :
  1. noeud n7;
  2. n7.val = 9;
  3. .......


 
le compilateur me dit:
abr.c: In function `main':
abr.c:152: parse error before `n7'
abr.c:153: `n7' undeclared (first use in this function)





 
tu déclares bien en début de bloc?


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 20-10-2002 à 18:38:40    

:D oupssss!!!
en effet c t pas au bonne endroit  :pt1cable:  
En tout cas merci à tous ceux ki on répondu :)
PROBLEME RESOLU :hello:

Reply

Marsh Posté le 20-10-2002 à 18:39:35    

cela dit ca dépend de ton compilateur. le C99 n'impose plus les déclarations de variables en début de bloc


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 20-10-2002 à 18:43:54    

Taz@PPC a écrit a écrit :

cela dit ca dépend de ton compilateur. le C99 n'impose plus les déclarations de variables en début de bloc




 
Mon compilateur c gcc 2.95.2 et apparement il supporte pas!

Reply

Marsh Posté le 20-10-2002 à 18:46:40    

plus ou moins, si tu compiles avec "-pedantic" en C (ou en C++) ca te donne des warnings a propos de l'ancienne norme C89/90
 
mais gcc 3.2 l'accepte parfaitement.
 
gcc 2.95 ne supprote pas ceci, mais d'autre aspects du C99 passent sans problèmes


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 21-10-2002 à 04:56:36    

Juste pour dire qu'on a parfaitement le droit d'utiliser le même nom pour la structure et le typedef, en C comme en C++.

Code :
  1. typedef struct noeud{
  2. struct noeud* pere; par la struct car le typedef n'existe pas encore
  3. //blabla
  4. }noeud;
  5. struct noeud nd1; //par la struct
  6.        noeud nd2; //par le typede


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 21-10-2002 à 10:47:11    

Harkonnen a écrit a écrit :

 
putain, c'était ça effectivement !!
moi aussi je me plaçais dans une optique C++ et j'ai pas percuté !  :fou:  




 
sclair, ca se perd vite ces bonnes vieilles habitudes du C :D

Reply

Marsh Posté le 21-10-2002 à 10:48:05    

Musaran a écrit a écrit :

Juste pour dire qu'on a parfaitement le droit d'utiliser le même nom pour la structure et le typedef, en C comme en C++.

Code :
  1. typedef struct noeud{
  2. struct noeud* pere; par la struct car le typedef n'existe pas encore
  3. //blabla
  4. }noeud;
  5. struct noeud nd1; //par la struct
  6.        noeud nd2; //par le typede






 
vi, ca je sais (je fais tjs comme ca), mais pourquoi diable y a t'il deux noms pour une struct ? (eg pourquoi la nommer en fin de def alors qu'elle est deja nommée en debut de def ?)

Reply

Marsh Posté le 21-10-2002 à 11:11:05    

chrisbk a écrit a écrit :

 
 
vi, ca je sais (je fais tjs comme ca), mais pourquoi diable y a t'il deux noms pour une struct ? (eg pourquoi la nommer en fin de def alors qu'elle est deja nommée en debut de def ?)
 




 
Ces deux nom ne sont pas equivalents...
 

Code :
  1. struct toto{};


 
defini une srtucture toto, mais pour la referencer il faut faire struct toto, toto seul ne suffit pas (en C)
 
d'ou le  
 

Code :
  1. typedef struct toto titi;


 
qui defini titi utilisable sans le struct...

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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