pb avec typedef

pb avec typedef - C - Programmation

Marsh Posté le 10-06-2005 à 23:42:02    

Hi
 
Voila, avec avoir lu et compilé des exemples sur les listes chainées qui marchent à merveille, j'ai décidé pour voir si j'avait compris, de tout refaire moi-même sans regarder les exemples. J'ai réussi sauf une chose : typedef.
 
J'avais au départ fait tout le programme en utilisant la dénomination "struct eltliste" pour le type, ça marchait, j'ai rajouté typedef pour moins de prise de tête, et là pb.
 
En effet voila la déclaration :

Code :
  1. typedef struct
  2. {
  3. struct eltliste *suiv;
  4. struct eltliste *prec;
  5.         int valeur;
  6. } eltliste;
  7. eltliste  *FirstElt = NULL, *LastElt = NULL;


 
Et voilà là ou bloque le compilateur (GCC - DevCpp)

Code :
  1. int Ajoute(eltliste **fLastElt, int valeur)
  2. {
  3. eltliste temp;
  4. temp = **fLastElt;
  5. temp.suiv = malloc(sizeof(eltliste));
  6. if (temp.suiv==NULL) return -1;
  7. temp.suiv->prec = *fLastElt;   // <----------------- ici
  8. temp.suiv->suiv = NULL;
  9. temp.suiv->valeur = valeur;
  10. **fLastElt = temp;
  11. *fLastElt = (*fLastElt)->suiv;
  12. }


[ certes ne n'est pas très bien codé, un peu trop compliqué pour rien ]
 
Il me dit : "dereferencing pointer to incomplete type".
Je rappelle que je n'ai rien changé sauf la dénomination de la structure (de "struct eltliste" à "eltliste" ).
Les champ prec et suiv étant eux par contre déclarés de type "struct eltliste", on peut penser que l'incompatibilité vient de là. Or les exemples que j'avais trouvé, j'ai vérifié marchait exactement pareil, le compilateur considérait donc que "struct eltliste" = "eltliste".
 
Où est la subtilité ?

Reply

Marsh Posté le 10-06-2005 à 23:42:02   

Reply

Marsh Posté le 10-06-2005 à 23:44:39    

Voila le code des exemples que j'avais trouvé :
 

Code :
  1. typedef struct pile
  2. {
  3.         int valeur;
  4.         struct pile *prec;
  5. } pile ;


 
la fonction "Ajouter" :

Code :
  1. void Push(pile **p, int Val)
  2. {
  3.         pile *element = malloc(sizeof(pile)); 
  4.         if(!element) return
  5.         element->valeur = Val;   
  6.         element->prec = *p;      <--------- prec = "struct pile", p = "pile"
  7.         *p = element;
  8. }


Là, ça marche !
 
 :heink:


Message édité par theredled le 10-06-2005 à 23:46:40
Reply

Marsh Posté le 10-06-2005 à 23:59:33    

theredled a écrit :


on :

typedef struct  
{
 struct eltliste *suiv;
 struct eltliste *prec;
        int valeur;
} eltliste;



Marche pas. 'struct eltliste' n'est pas défini.
 
Une solution :  


typedef struct eltliste
{
   struct eltliste *suiv;
   struct eltliste *prec;
   int valeur;
}  
eltliste;



Message édité par Emmanuel Delahaye le 11-06-2005 à 00:00:37

---------------
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 11-06-2005 à 00:05:12    

c'est quoi ces manie de mettre de maj au variables mais pas au type ? c'est pourtant pas compliqué. Homme / un homme. C'est une histoire de nom / nom commun.

Reply

Marsh Posté le 11-06-2005 à 00:05:17    

:bounce: Oh :bounce:  
 
Lumière que tu es.
 

Citation :

Marche pas. 'struct eltliste' n'est pas défini.


Tu veux dire qu'il n'est pas défini pour *suiv et *prec j'imagine? Il est défini après quand même ?

Reply

Marsh Posté le 11-06-2005 à 00:06:02    

après l'heure, c'est plus l'heure

Reply

Marsh Posté le 11-06-2005 à 00:09:35    

theredled a écrit :

Citation :

Marche pas. 'struct eltliste' n'est pas défini.


Tu veux dire qu'il n'est pas défini pour *suiv et *prec j'imagine? Il est défini après quand même ?


Ben non. Il est jamais défini.


---------------
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 11-06-2005 à 00:10:08    

Tout à fait Taz (pr tes 2 msg, quoique j'ai pas compris le 2e [EDIT : en fait si je crois]).
 
Pas con le truc homme Homme. On peut même expliquer HOMME = mr DUTROU = une personne définie = constante.
 
En fait c'est juste que la variable je l'utilise plus souvent donc je lui met un nom plus comprehensible quoi. Mais un homme, l'Homme quoi c'est vrai merde...


Message édité par theredled le 11-06-2005 à 00:17:40
Reply

Marsh Posté le 11-06-2005 à 00:13:46    

Emmanuel Delahaye a écrit :

Ben non. Il est jamais défini.


 
?
 
Source http://www.linux-kheops.com/doc/ansi-c/
 

Citation :

Si on déclare :  
 
typedef struct
   {
   ...
   } PERSONNE;
 
les déclarations de variables se feront par :  
 
PERSONNE p1,p2;


 
Apparemment chez lui ça marche pourtant. Et le compil n'a pas crié pour "eltlist *FirstEl".  :??:


Message édité par theredled le 11-06-2005 à 00:15:03
Reply

Marsh Posté le 11-06-2005 à 00:16:14    

vraiment ça me tue toutes ces économies de bout de chandelles pour au final passer sa soirée devant des problèmes qui n'existe pas.
 
Fais en 2 fois. On voit très communément :

Code :
  1. typedef struct _Foo Foo;
  2. struct _Foo
  3. {
  4. };

Reply

Marsh Posté le 11-06-2005 à 00:16:14   

Reply

Marsh Posté le 11-06-2005 à 00:17:42    

theredled a écrit :


Citation :

Si on déclare :  
 
typedef struct
   {
   ...
   } PERSONNE;
 
les déclarations de variables se feront par :  
 
PERSONNE p1,p2;
 
on voit que la seconde méthode permet d'éviter d'avoir à répéter struct.


 
Apparemment chez lui ça marche pourtant. Et le compil n'a pas crié pour "eltlist *FirstEl".  :??:


 
Je répète " struct eltliste n'est jamais défini". Je ne te parle pas de 'eltliste' qui est défini par le typedef et qui pourrait s'appeler tartemolle...


---------------
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 11-06-2005 à 00:43:18    

ok
 
merci !


Message édité par theredled le 11-06-2005 à 00:43:47
Reply

Sujets relatifs:

Leave a Replay

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