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

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

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

    Informations forums :
    Inscription : Août 2011
    Messages : 754
    Points : 376
    Points
    376
    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 sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    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 averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Août 2011
    Messages : 754
    Points : 376
    Points
    376
    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 sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    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 averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Août 2011
    Messages : 754
    Points : 376
    Points
    376
    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
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    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 ?

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

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

    Informations forums :
    Inscription : Août 2011
    Messages : 754
    Points : 376
    Points
    376
    Par défaut
    Un type de structure à priori; mais c'est sensiblement la même chose; faire un typedef nous permet juste de "poser" un nom sur une structure sans pour autant avoir à ré-utiliser le mot struct.


    La question n'est pas là.

    Je vais vous la poser autrement via un exemple

    main.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include <stdio.h>
    #include <stdlib.h>
    #include "main.h"
     
    typedef struct maStruct
    {
        int champ;
    } nom_typeStruct; // on definit un type de structure

    main.h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #ifndef main
    #define main
     
    // ici je voudrais déclarer par exemple un tableau dont chaque élément serait du type de la structure défini dans le .c ==> Comment faire cela ?
     
    #endif // main

    EDIT: Je ne dois pas déclarer ma structure dans le .h je sais bien qu'on est censé faire comme ça; mais en cours on nous as dit que pour protéger les données il fallait déclarer sa structure dans le .c, d'où le fait que je cherche comment m'en servir après dans le .h

    Je ne veux pas spécialement de variable globale; je veux juste arriver à travailler sur ma structure dans le .h en l'ayant défini dans le .c



    EDIT2: En fait la solution était toute bête; il suffisait de passer par un pointeur sur la structure dans le .h

    Problème résolu, merci pour votre aide.

  8. #8
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Euh... Je me trompe peu-être et je vais peut-être paraître insistant mais le problème est là.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    typedef struct
    {
        int champ;
    } nom_type; // on definit un type de structure
     
    struct autre_type
    {
        int champ;
    }; // on definit un type de structure mais on est oblige d'utiliser le mot cle struct pour declarer une varible
    Ici, je définis deux nouveaux types. L'un possède un alias qui me permet de me passer du mot-clé struct pour créer des variables de ce type. Mais ici, je n'ai créé aucune structure. Juste des types.

    // ici je voudrais déclarer par exemple un tableau dont chaque élément serait du type de la structure défini dans le .c
    Il ne faut pas déclarer des variables sans extern dans un fichier .h.
    Je ne dois pas déclarer ma structure dans le .h je sais bien qu'on est censé faire comme ça; mais en cours on nous as dit que pour protéger les données il fallait déclarer sa structure dans le .c, d'où le fait que je cherche comment m'en servir après dans le .h
    Cela me semble contradictoire avec la précédente citation.

    En fait la solution était toute bête; il suffisait de passer par un pointeur sur la structure dans le .h
    Je suis curieux de voir ton code. Je ne vois pas comment tu peux déclarer un pointeur vers ton typedef de main.c

+ 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