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 :

Utilisation d'un tableau de structures


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 756
    Par défaut Utilisation d'un tableau de structures
    Est il possible d'utiliser dans un .h une structure défini dans un .c
    A fortiori, on fait plutôt le contraire; mais je voudrais savoir si cette méthode est réalisable.


    Dans votre main.c vous avez un truc du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    typedef struct uneStructure {
    champ de la structure
    } A
    Si je voulais créer un tableau de structure dans le main; il me suffirait de faire

    Mais si je veux créer mon tableau de structure dans le .h lié au main; je fais comment ? La même syntaxe que celle présenté au dessus ne veut pas fonctionner.

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Ceci marche dans un .h:

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    typedef struct uneStructure {
    	/*champs de la structure*/
    } A;
     
    typedef struct uneAutreStructure {
    	A tab[NB_VAL];
    } B;
     
    /*Déclaration d'une variable globale.
      Penser à la définir dans un des .c*/
    extern A g_unTableauGlobal[NB_VAL];
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 756
    Par défaut
    Donc si j'ai bien compris; dans ton .c tu met les deux typedef.

    Et dans le .h le extern ? (soit dit en passant je ne connais pas l'effet de extern)

    Ce n'est pas un peu "bourrin" de faire une structure qui ne contiendra qu'un seul champ ?

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Le problème, c'est qu'on ne sait pas ce que tu cherches à faire exactement. Tu exprimes mal ton objectif dans ton premier message.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 756
    Par défaut
    OK

    Je veux dans un premier temps

    Définir une structure dans mon .c ça c'est OK

    Dans un second temps je veux pouvoir utiliser cette structure dans mon .h
    Soit pour créer un tableau de cette structure soit pour d'autres choses.

    ==> Je cherche à utiliser dans un .h une structure défini dans un .c et non l'inverse

  6. #6
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Tu veux définir un type de structure ou une structure ? Je présume que tu es dans le cas 1.

    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
    #include <stdio.h>
    #include <stdlib.h>
     
    typedef struct
    {
        int champ;
    } nom_type; // on definit un type de structure
     
    int main()
    {
        nom_type s = {1};
     
        struct {
            int a;
            int b;
        } nom_variable; // on definit une structure mais pas de type
     
        nom_variable.a = 2;
        nom_variable.b = s.champ;
        return 0;
    }
    Si tu veux faire un nouveau type, tu dois le faire dans le .h et inclure ce .h là où tu as besoin du type. Si tu souhaites ensuite utiliser un tableau de ce type, tu crées la variable de manière globale dans un .c et dans un .h, tu utiliser une déclaration avec extern.

    Tu ne peux pas déclarer sans extern dans un .h (que ce soit une structure comme dans mon code ou un tableau de ton nouveau type) car tu vas l'inclure plusieurs fois et donc tu vas dupliquer ta variable globale et tu auras des erreurs à la compilation (pour être exact, à l'édition des liens) te disant que le symbole est défini plusieurs fois ("muliple definitions of symbols...").

    Et sinon, une variable globale, c'est généralement pas la bonne solution. Que souhaites-tu faire ?

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 30/04/2010, 11h33
  2. Utilisation d'un tableau dans une structure
    Par Angelique64 dans le forum VB.NET
    Réponses: 2
    Dernier message: 27/06/2009, 11h05
  3. Réponses: 2
    Dernier message: 23/02/2009, 11h23
  4. Réponses: 11
    Dernier message: 30/04/2008, 10h18
  5. Trier un tableau de structures
    Par Yux dans le forum C
    Réponses: 7
    Dernier message: 05/11/2005, 17h28

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