IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Déclaration de structures dépendantes


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 7
    Par défaut Déclaration de structures dépendantes
    Bonjour à tous, premier message ici bien que le forum et la faq m'ont déjà beaucoup aidé ^^

    J'ai un petit souci de déclaration, je voudrais avoir 2 structures qui ont chacune l'autre structure dans leurs membres.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    typedef struct{
      int num_etat;
      int estTerminal;
      int nb_transaction;
      Transition trans_suiv[MAXLETTRE];
    }Etat;
     
    typedef struct{
       char lettre;
       Etat* etat_suiv;
    }Transition;
    Le problème étant que bien sûr la 1ère structure ne connaît pas encore la 2è lors de la déclaration... j'ai pas trouvé grand chose sur le net, je sais même pas si ça porte un nom précis ou pire si c'est faisable

    Merci

  2. #2
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Ceci devrait t'aller.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    struct Etat_;
    struct Transition_;
     
    struct Transition_ {
       char lettre;
      struct  Etat_* etat_suiv;
    };
     
    struct Etat_ {
      int num_etat;
      int estTerminal;
      int nb_transaction;
      struct Transition_ trans_suiv[11];
    };
     
     
     
    typedef struct Transition_ Transition;
    typedef struct Etat_ Etat;

  3. #3
    Membre Expert
    Avatar de InOCamlWeTrust
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 036
    Par défaut
    Citation Envoyé par millie
    Ceci devrait t'aller.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    struct Etat_;
    struct Transition_;
     
    struct Etat_ {
      int num_etat;
      int estTerminal;
      int nb_transaction;
      struct Transition_ trans_suiv[MAXLETTRE];
    };
    Et non !

    struct Transition_ est un type incomplet : on n'a donc pas le droit de déclarer un tableau d'éléments de struct Transition_ tant que le type n'est pas devenu complet. Le compilateur, à ce niveau-là, ne connaît pas la taille de la structure struct Transition_ et ne peut donc pas créer le type... d'autant plus qu'il se pourrait très bien que l'implantation de struct Transition_ ne soit JAMAIS connue !

  4. #4
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Citation Envoyé par InOCamlWeTrust
    Et non !

    struct Transition_ est un type incomplet : on n'a donc pas le droit de déclarer un tableau d'éléments de struct Transition_ tant que le type n'est pas devenu complet. Le compilateur, à ce niveau-là, ne connaît pas la taille de la structure struct Transition_ et ne peut donc pas créer le type... d'autant plus qu'il se pourrait très bien que l'implantation de struct Transition_ ne soit JAMAIS connue !

    Ca m'apprendra à pas vérifier le code que j'écris (le compilateur m'aurait dit et j'aurais vu que c'était pas le bon ordre )

  5. #5
    Membre Expert
    Avatar de InOCamlWeTrust
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 036
    Par défaut
    Citation Envoyé par millie
    Ca m'apprendra à pas vérifier le code que j'écris (le compilateur m'aurait dit et j'aurais vu que c'était pas le bon ordre )
    Moi non plus j'ai pas vérifié le mien !

  6. #6
    Membre Expert
    Avatar de InOCamlWeTrust
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 036
    Par défaut
    Tu pointes du doigt l'une des règles les moins connues des gens qui programment en C : les types incomplets.

    Le C est un outil extrêmement puissant, mais le maîtriser à moitié, c'est se brûler les doigts à coup sûr un jour ou l'autre.

    Ton problème est un problème de récursivité mutuelle dans la déclaration de types. Etant donné que tu sais que les deux types sont des structures, je te conseille d'utiliser très précisément la règle des types incomplets.

    Un type est dit incomplet à un endroit du code si son implantation n'est pas (encore) connue à ce niveau. Utiliser des types incomplets est donc interdit, sauf lorsque l'on veut déclarer un pointeur vers un type incomplet qui est une structure ou une union : le type résultant (i. e. : le pointeur) devient alors un type complet.

    Dans ton exemple, et afin que le typeur reconnaisse tes deux types comme des structures, tu peux commencer par les déclarer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    typedef struct Etat_ Etat;
    typedef struct Transition_ Transition;
    Pour s'en sortir, tu dois d'abord déclarer la structure Transition si tu veux réellement conserver un tableau de Transition dans ta structure Etat (autrement, tu ne peux pas).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    struct Transition_
    {
       char lettre;
       Etat *etat_suiv;
    };
    A ce niveau-là, le type Transition devient complet car son implantation est connue ; en effet, même si Etat est incomplet, Etat *, par contre, lui est complet, et tu peux donc implanter un tableau de Transition dans ta structure Etat. Si tu avais procédé inversement, tu n'aurais pas pu.

    Puis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    struct Etat_
    {
      int num_etat;
      int estTerminal;
      int nb_transaction;
      Transition trans_suiv[MAXLETTRE];
    };

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 7
    Par défaut
    Réponse rapide et efficace
    Je vous remercie.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 26/02/2014, 16h58
  2. Déclaration des structures
    Par DavidleVrai dans le forum Débuter
    Réponses: 5
    Dernier message: 03/05/2013, 15h03
  3. Déclaration de structures et pointeurs de structure
    Par Alpha573 dans le forum Débuter
    Réponses: 1
    Dernier message: 22/11/2011, 18h09
  4. [WD14] Déclaration de structure via compilation dynamique
    Par cladoo dans le forum WinDev
    Réponses: 14
    Dernier message: 15/02/2011, 14h22
  5. déclaration de structure
    Par boboss123 dans le forum C
    Réponses: 10
    Dernier message: 21/12/2009, 12h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo