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 :

implementer une struct dans un .c


Sujet :

C

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2003
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 16
    Points : 12
    Points
    12
    Par défaut implementer une struct dans un .c
    Bonjour,

    Je voudrai pouvoir creer un module possedant une structure Reseau seulement visible dans la partie privée de ce module (le .c). Voici mes fichiers (simplifiés au maxi)

    reseau.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #ifndef RESEAU_H
    #define RESEAU_H
     
    typedef struct Reseau Reseau;
     
    #endif
    reseau.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #include "reseau.h"
     
    struct Reseau {
      int **r;
      int nb;
    };
    main.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #include "reseau.h"
     
    int main(int argc,char** argv){
      Reseau *r;
      /* erreur de compilation sur cette ligne : dereferencing pointer to     incomplete type */
      r->nb=2;  
      return 0;
    }
    le module reseau compile, mais il ne veut pas creer main.o
    Quelqu'un aurait il une idée ?

  2. #2
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef struct Reseau Reseau;
    Le nom de la structure et le nom de la variable doivent être différenciée !

  3. #3
    Membre à l'essai
    Inscrit en
    Mars 2003
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 16
    Points : 12
    Points
    12
    Par défaut
    Le nom de la structure et le nom de la variable doivent être différenciée !
    je viens de tester et ça ne change rien

  4. #4
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    C'est du C...

    ne pas oublier d'initialiser

  5. #5
    Membre à l'essai
    Inscrit en
    Mars 2003
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 16
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par Ti-R
    C'est du C...

    ne pas oublier d'initialiser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    struct Reseau {
      ...
    };
     
    typedef struct Reseau Reseau;
     
    ...
    Reseau r;
    je ne vois aucun problème avec ça

  6. #6
    Membre habitué
    Avatar de barthelv
    Inscrit en
    Mars 2003
    Messages
    267
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 267
    Points : 126
    Points
    126
    Par défaut
    moi ce que je fais d'habitude :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    .h on met
     
    typedef struct
    {
     
    } Reseau;
     
    .c on met
     
    typedef struct
    {
      Reseau * Obj;
      ...
    } ExtendedReseau;
    Et a chaque fois que dans une fonction on me passe Reseau, je le cast en ExtendedReseau. Par contre cela necessite que l'appelant appelle une de tes fonctions pour initialiser le Reseau.

    exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DWORD Reseau_Start(Reseau ** Obj);

  7. #7
    Membre à l'essai
    Inscrit en
    Mars 2003
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 16
    Points : 12
    Points
    12
    Par défaut
    barthelv :
    Ce que tu fais est pas mal mais ce que je voudrai savoir c'est si il est
    possible de ne declarer que le nom de la structure dans le .h et l'implementation dans le .c sans se prendre des erreurs de compil des que j'essaie d'acceder aux attributs de ma structure dans le main.

    Si quelqu'un pouvait m'eclairer a ce sujet ça serait vraiment cool

  8. #8
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    A ajouter dans le .h ?
    Mais la je suis limite sur les spécifications pur C... vu que ma spécialité est le C++

    Le gros problème est que ton compilateur lorsqu'il inclus ton .h ne trouve pas ta structure, aucune référence dessus... à par le typedef qui redéfini le type... mais qui indique en rien que ta structure se trouve dans le .c

    Mot clé extern à ajouter devant…

  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 : 68
    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 Ti-R
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef struct Reseau Reseau;
    Le nom de la structure et le nom de la variable doivent être différenciée !
    Aucune importance en C. En plus, ici, ce n'est pas une variable, mais un alias (typedef)

  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 : 68
    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: implementer une struct dans un .c
    Citation Envoyé par jamal
    Je voudrai pouvoir creer un module possedant une structure Reseau seulement visible dans la partie privée de ce module (le .c). Voici mes fichiers (simplifiés au maxi)

    reseau.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #ifndef RESEAU_H
    #define RESEAU_H
     
    typedef struct Reseau Reseau;
     
    #endif
    Interface de données opaques. Ok.
    reseau.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #include "reseau.h"
     
    struct Reseau {
      int **r;
      int nb;
    };
    Définition interne des données. OK

    main.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #include "reseau.h"
     
    int main(int argc,char** argv){
      Reseau *r;
      /* erreur de compilation sur cette ligne : dereferencing pointer to     incomplete type */
      r->nb=2;  
      return 0;
    }
    2 erreurs fondamentales.
    • Le pointeur 'r' n'est pas initialisé. Déréfrérencer un pointeur non initialisé entraine un comportement indéfini.
    • le type Reseau étant opaque, on ne peut évidemment pas accéder à ses éléments directement. C'est le but de la manoeuvre!

    Avant d'aller plus loin, je te conseille vivement une lecture approfondie de cet article. N'hésite pas à poser des questions si tu ne comprends pas.

    http://emmanuel-delahaye.developpez.com/tad.htm

  11. #11
    Membre à l'essai
    Inscrit en
    Mars 2003
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 16
    Points : 12
    Points
    12
    Par défaut
    Emmanuel Delahaye:
    Merci pour ce lien trés instructif j'aurai du y penser si je cache la structure
    c'est pas pour qu'on puisse accéder aux éléments nimporte ou.

    le type Reseau étant opaque, on ne peut évidemment pas accéder à ses éléments directement. C'est le but de la manoeuvre!
    En effet tout est dit la dedans ...

    Merci

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 03/12/2012, 20h26
  2. Déclaration d'une struct dans une fonction?
    Par fleg666 dans le forum Débuter
    Réponses: 7
    Dernier message: 24/01/2011, 12h47
  3. MAJ d'une STRUCT dans une PROC
    Par pfo69 dans le forum x86 32-bits / 64-bits
    Réponses: 3
    Dernier message: 08/04/2009, 18h23
  4. passer unee struct dans un buffer (char *)
    Par baert dans le forum C++
    Réponses: 2
    Dernier message: 20/02/2006, 22h49
  5. mettre les termes d'un string dans une struct
    Par grand's dans le forum SL & STL
    Réponses: 17
    Dernier message: 29/11/2004, 18h43

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