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 :

Definitions de types pas encore definis dans un type


Sujet :

C

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 95
    Points : 66
    Points
    66
    Par défaut Definitions de types pas encore definis dans un type
    Salut !

    j'ai un trou de memoire qui me trouble.. Comment faire pour pouvoir declarer dans un type, des types qui n'ont pas encore été déclaré ?

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    typedef struct {
      typeA a;
      int truc;
    } typeB;
     
    typedef struct {
      typeB b;
      char * machin;
    } typeA;
    On peut faire des prototypes ?

    merci
    a+

  2. #2
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Oulà, il y a peut être un problème de conception monsieur.

    Tu peux utiliser des proto pour les fonctions mais pour les types je ne crois pas ...

  3. #3
    Membre expérimenté
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Points : 1 421
    Points
    1 421
    Par défaut
    je doute qu'on puisse mettre une structure dans une autre.

    par contre un pointeur sur une autre structure dans une structure, c'est faisable.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    typedef struct{
    int ch1;
    int ch2;
    }mystruc1;
     
    typedef struct{
    char plope[12];
    struct mystruc1 *struc;
    }mystruc2;
    par contre, j'ai du mal avec ton exemple:
    t'as essayé de remplacer typeA par sa definition dans typeB pour voir? :p
    click my www
    ............|___
    ...................\
    .................._|_
    ..................\ /
    ..................."

  4. #4
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    En fait ça ressemble à une double récursivité ... Mais ce genre de truc est tout de même extremement rare et c'est comme je l'ai dis dans mon précédent post, un problème de conception.

  5. #5
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par PRomu@ld
    En fait ça ressemble à une double récursivité ... Mais ce genre de truc est tout de même extremement rare et c'est comme je l'ai dis dans mon précédent post, un problème de conception.
    Les types mutuellement recursifs ne sont pas rares du tout. En tout cas moi ca m'arrive bien souvent avec un type intermediaire (qui sert de conteneur).
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  6. #6
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Et bien désolé alors, j'ai pas l'habitude de les rencontrer tous les jours... . la seule fois que j'ai eu affaire à ça c'était pour un algo minmax, j'avais une fonction min et une fonction max, mais là il s'agissait de fonction et pas de type, de plus ce genre d'algo peut se mettre sous forme simplement récursive.

    En tout cas moi ca m'arrive bien souvent avec un type intermediaire (qui sert de conteneur).
    En fait tu as deux types qui font références à un même troisième type c'est ça ? Parce que dans ce cas, ce n'est plus une double récursivité.

  7. #7
    Membre expérimenté

    Inscrit en
    Mai 2002
    Messages
    720
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 720
    Points : 1 594
    Points
    1 594
    Par défaut
    Bonjour

    Une structure dans une autre, rien de bien sorcier. Mais des structures qui ont chacunes un membre qui est du type de l'autre structure c'est conceptuellement impossible :

    • Imaginons A qui a un membre b de type B et B qui a un memebre a de type A. x est une variable de type A.

      on peut donc acceder à : x (1), x.a (2), x.a.b (3), x.a.b.a x.a.b.a.b.a.b.a.b.a (4)

      Mais les deux "a" (2 et 4) ne sont pas les mêmes ... il faudrait donc une espece de mémoire infinie qui permette d'acceder à tout ca


    Bref, plus logiquement, A a un membre b qui pointe sur une structure de type B et B a un membre a qui pointe sur une structure de type A.


    Exemple de ce genre de choses (tout droit sortie de mes codes sources) :

    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
    struct choice {
    	int Number;
    	char * Name;
    	int Popularity;
    	int Encountered;		/* How many time did we saw it ? */
    	double Score;
    	struct choice * Next;
     
    	struct preference * last_ref;
    } * pchoice;
     
    struct preference {
    	char * Name;
    	struct choice ** Choices;	/* Preference choices order */
    	int Injury;					/* Preferences taken by the others */
    	struct preference * Next;
    } * ppreference;

    Smortex

    Les FAQ Assembleur - Linux
    In The Beginning Was The Command Line Neal Stephenson

  8. #8
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par PRomu@ld
    En tout cas moi ca m'arrive bien souvent avec un type intermediaire (qui sert de conteneur).
    En fait tu as deux types qui font références à un même troisième type c'est ça?
    Non. Un type qui référence un deuxième qui référence le troisième qui référence le premier. Il y a bien une boucle.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  9. #9
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: Definitions de types pas encore definis dans un type
    Citation Envoyé par lechewal
    Comment faire pour pouvoir declarer dans un type, des types qui n'ont pas encore été déclaré ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    typedef struct {
      typeA a;
      int truc;
    } typeB;
     
    typedef struct {
      typeB b;
      char * machin;
    } typeA;
    Déjà, pose toi la question de savoir si tu as vraiment besoin d'avoir de tels croisements, parce que c'est souvent le signe d'une mauvaise conception. Mais si tu y tiens, c'est possible si ce sont des pointeurs en utilisant des définitions de structures séparées :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    struct A;
     
    typedef struct {
      struct A *a;
      int truc;
    } typeB;
     
    typedef struct A {
      typeB b;
      char * machin;
    } typeA;
    ou des typedefs séparés :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    typedef struct A TypeA;
     
    typedef struct {
      TypeA *a;
      int truc;
    } typeB;
     
    typedef struct A {
      typeB b;
      char * machin;
    } typeA;
    Pas de Wi-Fi à la maison : CPL

  10. #10
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par PRomu@ld
    Oulà, il y a peut être un problème de conception monsieur.
    C'est bien possible.
    Tu peux utiliser des proto pour les fonctions mais pour les types je ne crois pas ...
    On peut utiliser des déclaration de structures incomplètes pour des pointeurs. On fait ça tous les jours avec les ADT...

    http://emmanuel-delahaye.developpez.com/tad.htm
    Pas de Wi-Fi à la maison : CPL

  11. #11
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 95
    Points : 66
    Points
    66
    Par défaut
    Ok, je vous remercie tous,je vais essayer de proceder autrement et si je n'y arrive pas, j'utiliserai la methode des pointeurs sur struct !

    encore merci
    a bientot

  12. #12
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut Re: Definitions de types pas encore definis dans un type
    Citation Envoyé par Emmanuel Delahaye
    Déjà, pose toi la question de savoir si tu as vraiment besoin d'avoir de tels croisements, parce que c'est souvent le signe d'une mauvaise conception.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    typedef struct I I;
    typedef struct N N;
     
    struct I {
       N* n;
       struct I* next;
       struct I* prev;
       /* et d'autres champs */
    };
     
    struct N {
       I** tableOfI;
       /* et d'autres champs */
    };
    Si tu penses qu'il s'agit d'une mauvaise conception, pourrais-tu en donner les raisons et proposer des alternatives? Il faut pouvoir passer d'un N aux I, d'un I au N, ajouter un I à un N, enlever un I d'un N. Un N peut avoir facilement une dizaine de milliers de I (la tableOfI est une table de hachage que d'autres champs permettent de gérer -- en pratique c'est encapsulé par un type intermédiaire).
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  13. #13
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: Definitions de types pas encore definis dans un type
    Citation Envoyé par Jean-Marc.Bourguet
    Citation Envoyé par Emmanuel Delahaye
    Déjà, pose toi la question de savoir si tu as vraiment besoin d'avoir de tels croisements, parce que c'est souvent le signe d'une mauvaise conception.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    typedef struct I I;
    typedef struct N N;
     
    struct I {
       N* n;
       struct I* next;
       struct I* prev;
       /* et d'autres champs */
    };
     
    struct N {
       I** tableOfI;
       /* et d'autres champs */
    };
    Si tu penses qu'il s'agit d'une mauvaise conception, pourrais-tu en donner les raisons et proposer des alternatives? Il faut pouvoir passer d'un N aux I, d'un I au N, ajouter un I à un N, enlever un I d'un N. Un N peut avoir facilement une dizaine de milliers de I (la tableOfI est une table de hachage que d'autres champs permettent de gérer -- en pratique c'est encapsulé par un type intermédiaire).
    Je pense qu'il s'agit d'une utilisation avancée du langage C.

    Dans le cas du posteur original (que je suppose être un débutant, peut être à tord), souvent un peu de reflexion sur l'organisation des données permet d'éviter ça.

    Mais j'admet qu'il existe des cas où il n'est pas possible de faire autrement, et je n'ai d'ailleurs rien dit d'autre dans mon intervention. J'ai même indiqué comment faire.
    Pas de Wi-Fi à la maison : CPL

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 21/07/2011, 19h50
  2. [Oracle] ORA-08002: séquence pas encore définie dans cette session
    Par cornnery dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 20/03/2009, 17h22
  3. Type enum et pas de valeur dans le champs
    Par GreenGoblin dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 23/03/2006, 16h09
  4. Séquence pas encore définie dans cette session
    Par hair_peace dans le forum Oracle
    Réponses: 2
    Dernier message: 03/11/2005, 17h04
  5. Réponses: 4
    Dernier message: 05/09/2005, 22h58

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