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 :

structures qui s'appellent réciproquement


Sujet :

C

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut structures qui s'appellent réciproquement
    Bonjour, j'ai fait 2 structures qui s'auto-appellent : voici mon species.h
    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
    20
    21
    22
    23
     
    #ifndef _SPECIES_H_
    #define _SPECIES_H_
     
    #include "mechanism.h"
     
    typedef struct {
        char * name; /* name */
        double M;    /* molar mass */
        double T;    /* critical temperature */
        double * LT; /* 7 low temperature coefficients */
        double * HT; /* 7 high temperature coefficients */
    } Species;
     
    Species * CreateEmptySpecies(void);
    Species * CreateSpecies(char *,double,double,double *,double *);
    Species * CopySpecies(Species *);
    void PrintSpecies(Species *);
    void DestroySpecies(Species **);
    unsigned short NumberSpecies(char *,Mechanism *); // ici il y a un Mechanism
    void LoadSpecies(char [],char *,Species *);
     
    #endif
    Et voici mon mechanism.h
    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
     
    #ifndef _MECHANISM_H_
    #define _MECHANISM_H_
     
    #include "vector.h"
    #include "matrix.h"
    #include "species.h"
     
    typedef struct{
    unsigned short ns; /* numbers of species */
    unsigned short nr; /* numbers of reactions */
    Species ** species; /* array of species */
    il y a d'autres champs comme des matrices et des tableaux
    } Mechanism;
     
    Donc Species et Mechanism s'appellent réciproquement. Comment faire ? J'ai une solution : ma fonction NumberSpaces(char *, Mechanism *) peut etre transformée en NumberSpaces(char *,Matrix * m1,Matrix * m2) et ainsi le tour est joué, mais j'aimerais garder le prototype  NumberSpaces(char *, Mechanism *)
     
    Avez-vous une idée ?
    Merci.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    Pardon, je vous renvoie mon poste avec une meilleure présentation :

    Bonjour, j'ai fait 2 structures qui s'auto-appellent : voici mon species.h
    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
    20
    21
    22
    23
     
    #ifndef _SPECIES_H_
    #define _SPECIES_H_
     
    #include "mechanism.h"
     
    typedef struct {
        char * name; /* name */
        double M;    /* molar mass */
        double T;    /* critical temperature */
        double * LT; /* 7 low temperature coefficients */
        double * HT; /* 7 high temperature coefficients */
    } Species;
     
    Species * CreateEmptySpecies(void);
    Species * CreateSpecies(char *,double,double,double *,double *);
    Species * CopySpecies(Species *);
    void PrintSpecies(Species *);
    void DestroySpecies(Species **);
    unsigned short NumberSpecies(char *,Mechanism *); // ici il y a un Mechanism
    void LoadSpecies(char [],char *,Species *);
     
    #endif
    Et voici mon mechanism.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #ifndef _MECHANISM_H_
    #define _MECHANISM_H_
     
    #include "vector.h"
    #include "matrix.h"
    #include "species.h"
     
    typedef struct{
    unsigned short ns; /* numbers of species */
    unsigned short nr; /* numbers of reactions */
    Species ** species; /* array of species */
    il y a d'autres champs comme des matrices et des tableaux
    } Mechanism;
    Donc Species et Mechanism s'appellent réciproquement. Comment faire ? J'ai une solution : ma fonction NumberSpaces(char *, Mechanism *) peut etre transformée en NumberSpaces(char *,Matrix * m1,Matrix * m2) et ainsi le tour est joué, mais j'aimerais garder le prototype NumberSpaces(char *, Mechanism *)

    Avez-vous une idée ?
    Merci.

  3. #3
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Peut être en déclarant avant chaque structure l'autre structure.

    Ce procédé a un nom comme "pré déclaration" ou "déclaration anticipée" pour les classes en C++ notamment.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  4. #4
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par salseropom
    Avez-vous une idée ?
    Merci.
    Tu dois mettre une déclaration du type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    typedef struct species Species;
    avant la déclaration de ta structure (et avant le #include "mechanism.h") qui deviendra donc:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     struct species{
        char * name; /* name */
        double M;    /* molar mass */
        double T;    /* critical temperature */
        double * LT; /* 7 low temperature coefficients */
        double * HT; /* 7 high temperature coefficients */
    };
    Dans ton exemple, il n'est pas nécessaire de mettre un
    au début de mechanism.h mais tu pourrais le faire pour éviter un futur problème...

    Jc

  5. #5
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  6. #6
    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 salseropom
    Pardon, je vous renvoie mon poste avec une meilleure présentation :

    Bonjour, j'ai fait 2 structures qui s'auto-appellent : voici mon species.h
    Tant qu'on a que des pointeurs, il est possible de faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    /* a.h */
    #ifndef H_A
    #define H_A
    #include "b.h"
     
    struct a
    {
       int dummy;
    };
     
    int fa (struct a *pa, struct b *pb);
     
    #endif
    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
     
    /* b.h */
    #ifndef H_B
    #define H_B
    #include "a.h"
     
    struct b
    {
       int dummy;
    };
     
     
    int fb (struct a *pa, struct b *pb);
     
    #endif
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    /* main.c */
    #include "a.h"
     
    int main(void)
    {
       as_a;
       bs_b;
     
       fa (&a, &b)
       fb (&a, &b);
       return 0;
    }
    Pas de Wi-Fi à la maison : CPL

  7. #7
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  8. #8
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Citation Envoyé par salseropom
    Pardon, je vous renvoie mon poste avec une meilleure présentation :

    Bonjour, j'ai fait 2 structures qui s'auto-appellent : voici mon species.h
    Tant qu'on a que des pointeurs, il est possible de faire ceci :
    En effet, mais ici je pense que le problème au niveau de l'utilisation du nom donné par typedef. C'est pour cela que le compilateur n'était pas content.

    Donc si on veut garder la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Species ** species; /* array of species */
    On est contraint de le définir avant la structure, non?

    Jc

  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
    Citation Envoyé par fearyourself
    Donc si on veut garder la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Species ** species; /* array of species */
    On est contraint de le définir avant la structure, non?
    On peut toujours créer un typedef incomplet en plus. Je donnais le principe général...
    Pas de Wi-Fi à la maison : CPL

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    Bonjour, bon alors voici mes modifs,

    species.h
    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
    20
    21
    22
    23
     
    #ifndef _SPECIES_H_
    #define _SPECIES_H_
     
    struct Mechanism;
     
    typedef struct {
        char * name; /* name */
        double M;    /* molar mass */
        double T;    /* critical temperature */
        double * LT; /* 7 low temperature coefficients */
        double * HT; /* 7 high temperature coefficients */
    } Species;
     
    Species * CreateEmptySpecies(void);
    Species * CreateSpecies(char *,double,double,double *,double *);
    Species * CopySpecies(Species *);
    void PrintSpecies(Species *);
    void DestroySpecies(Species **);
    unsigned short NumberSpecies(char *,Mechanism *);
    void LoadSpecies(char [],char *,Species *);
     
    #endif
    mon mechanism.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #ifndef _MECHANISM_H_
    #define _MECHANISM_H_
     
    #include "vector.h"
    #include "matrix.h"
    #include "species.h"
     
    typedef struct{
    unsigned short ns; /* numbers of species */
    unsigned short nr; /* numbers of reactions */
    Species ** species; /* array of species */
    + d'autres champs du type vecteur ou matrices
    } Mechanism;
    et j'ai comme message d'erreur
    ../include/species.h:19: error: erreur de syntaxe before "Mechanism"
    Pourtant j'ai bien inclus mon mechanism dans mon species.h. Pouvez-vous m'aider encore un peu s'il vous plait ?

    Emmanuel, pourquoi y a-t-il deux fois
    ? Est-ce une "coquille" ou y a-t-il une raison (que je ne vois pas) ?

  11. #11
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Quelle idée!

    Dans le fichier species.h il faut déclarer la structure species comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #ifndef _SPECIES_H_
    #define _SPECIES_H_
     
    typedef struct species Species;
     
    struct species{
        char * name; /* name */
        double M;    /* molar mass */
        double T;    /* critical temperature */
        double * LT; /* 7 low temperature coefficients */
        double * HT; /* 7 high temperature coefficients */
    };
    et dans le fichier mechanism

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #ifndef _MECHANISM_H_
    #define _MECHANISM_H_
     
    typedef struct mechanism Mechanism;
     
    #include "vector.h"
    #include "matrix.h"
    #include "species.h"
     
    struct mechanism{
    Emmanuel, pourquoi y a-t-il deux fois

    ? Est-ce une "coquille" ou y a-t-il une raison (que je ne vois pas) ?
    Erreur de copier-coller de sa part...

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    OK merci !

  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
    Citation Envoyé par salseropom
    Bonjour, bon alors voici mes modifs,<...>
    Emmanuel, pourquoi y a-t-il deux fois
    ? Est-ce une "coquille" ou y a-t-il une raison (que je ne vois pas) ?
    Coquille. Corrigé.

    Tu remarqueras que a.h inclus b.h et que b.h inclus a.h

    D'autre part, je n'utilise que des pointeurs (ce qui, comme par hasard, est la 'bonne pratique' pour passer une structure à une fonction...)
    Pas de Wi-Fi à la maison : CPL

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 26/11/2006, 10h51
  2. Connaitre l'adresse url qui a appellé une page.
    Par morgan47 dans le forum Langage
    Réponses: 3
    Dernier message: 19/09/2006, 20h07
  3. CommandBar : Qui m'appelle ?
    Par AdD92 dans le forum Access
    Réponses: 2
    Dernier message: 15/06/2006, 20h33
  4. Réponses: 2
    Dernier message: 21/04/2006, 14h32
  5. formulaire qui doit appeler plusieurs pages
    Par rohel dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 27/01/2005, 08h59

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