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 imbriquées + allocation


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de nicodn02
    Profil pro
    Consultant .NET
    Inscrit en
    Mars 2007
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant .NET

    Informations forums :
    Inscription : Mars 2007
    Messages : 263
    Par défaut Structures imbriquées + allocation
    Bonsoir,
    je voudrais avoir une confirmation sur mon code.

    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
     
    typedef struct compagnie{
        char *nom;
        char acronyme[3];
    }Compagnie;
     
    typedef struct cellule_compagnie{
        Compagnie comp;
        struct cellule_compagnie *suivant;
    }Cellule_compagnie, *Liste_compagnie;
     
    int main(){
    /*Allocation dynamique */
     
    Liste_compagnie compagnie;
    compagnie=(Cellule_compagnie*)malloc(sizeof(Cellule_compagnie));
    /*Test si allocation == NULL */
    (...)
    Je voudrais savoir, comme ici, on a une structure dans une structure, dois-je allouer aussi la 2eme structure?
    Dois-je aussi allouer le char *nom ?

    Que ferez-vous pour que sa soit plus propre?

    Sachant que les structures au total sont:
    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
    24
    25
    26
     
    typedef struct avion{
        char identifiant[6];
        int carburant;
        int consommation;
        char heure_decollage[4];
        Compagnie *compagnie;
    }Avion;
     
    typedef struct cellule_avion{
        Avion avion;
        struct cellule_avion *suivant_compagnie;
        struct cellule_avion *precedent_compagnie;
        struct cellule_avion *suivant_attente;
    }Cellule_avion, *Liste_avions;
     
    typedef struct compagnie{
        char *nom;
        char acronyme[3];
        Liste_avions avions_compagnie;
    }Compagnie;
     
    typedef struct cellule_compagnie{
        Compagnie comp;
        struct cellule_compagnie *suivant;
    }Cellule_compagnie, *Liste_compagnie;
    Merci d'avance.

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par nicodn02 Voir le message
    Bonsoir,
    je voudrais avoir une confirmation sur mon code.

    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
     
    typedef struct compagnie{
        char *nom;
        char acronyme[3];
    }Compagnie;
     
    typedef struct cellule_compagnie{
        Compagnie comp;
        struct cellule_compagnie *suivant;
    }Cellule_compagnie, *Liste_compagnie;
     
    int main(){
    /*Allocation dynamique */
     
    Liste_compagnie compagnie;
    compagnie=(Cellule_compagnie*)malloc(sizeof(Cellule_compagnie));
    /*Test si allocation == NULL */
    (...)
    Je voudrais savoir, comme ici, on a une structure dans une structure, dois-je allouer aussi la 2eme structure?
    Dois-je aussi allouer le char *nom ?
    Si tu nommais tes types "t_..." et que tu ne masquais pas l'étoile derrière un nom de type tu comprendrais mieux ce que tu manipules.
    Le membre "comp" est une variable d'un type défini donc tu n'as pas besoin de l'allouer. Ce serait différent si c'était un pointeur mais ce n'est pas le cas.
    Le membre "nom" est un pointeur donc t'as pas le droit d'aller jouer avec "*nom" si t'as pas fait auparavant "nom=une_adresse_valide". Ca peut être malloc() ou autre chose...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre confirmé Avatar de nicodn02
    Profil pro
    Consultant .NET
    Inscrit en
    Mars 2007
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant .NET

    Informations forums :
    Inscription : Mars 2007
    Messages : 263
    Par défaut
    Ce que je voulais dire est:
    si j'ai deux structures dont une appel la structure supérieur (comme c'est le cas)

    dois-je d'abord allouer la structure "interne" puis celle "externe" ou simplement celle "externe".
    Mon avis ce porterai a faire un malloc simplement sur celle externe.

    Apres, connaissant le nom d'une compagnie(tmp), je ne peus pas faire un malloc sur char *nom?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    compagnie->nom=(char *)malloc((strlen(tmp)+1)*sizeof(char));

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par nicodn02 Voir le message
    Ce que je voulais dire est:
    si j'ai deux structures dont une appel la structure supérieur (comme c'est le cas)

    dois-je d'abord allouer la structure "interne" puis celle "externe" ou simplement celle "externe".
    Mon avis ce porterai a faire un malloc simplement sur celle externe.
    Si tu as une variable du type de ta structure externe alors tu fais rien. Si tu as un pointeur pointant vers un type "structure externe" il te faut l'allouer.

    Une fois que l'étape ci-dessus est passée, alors t'as une zone de type "structure externe" disponible. Maintenant tout dépend de cette structure. Si elle contient une variable de type "structure interne" alors tu ne fais rien car ta variable contient suffisamment de mémoire pour stocker cette structure. Si elle contient un pointeur alors lui-aussi il te faut l'allouer. Et on continue encore et encore tant que tes structures contiennent des pointeurs.
    A la libération faudra tout remonter dans l'autre sens...

    Citation Envoyé par nicodn02 Voir le message
    Apres, connaissant le nom d'une compagnie(tmp), je ne peux pas faire un malloc sur char *nom?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    compagnie->nom=(char *)malloc((strlen(tmp)+1)*sizeof(char));
    Et pourquoi pas ? Si "compagnie->nom" st un pointeur et que tu veux lui mettre des data il te faut de la mémoire pour stocker ces data.
    Mais généralement ce qui est fait est de définir un tableau de char suffisamment grand pour stocker le plus grand nom possible. Ca gaspille un peu de place mais ça simplifie le code...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre confirmé Avatar de nicodn02
    Profil pro
    Consultant .NET
    Inscrit en
    Mars 2007
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant .NET

    Informations forums :
    Inscription : Mars 2007
    Messages : 263
    Par défaut
    Merci
    ouai je sais, mais la je voudrais prendre la place exacte pour le nom

    Merci encore.

Discussions similaires

  1. Réponses: 4
    Dernier message: 15/05/2014, 20h25
  2. Réponses: 2
    Dernier message: 21/03/2007, 10h55
  3. structure imbriquée malloc problème
    Par tuxout dans le forum C
    Réponses: 3
    Dernier message: 26/02/2007, 06h49
  4. Malloc / structures imbriquées
    Par Lolita59 dans le forum C
    Réponses: 14
    Dernier message: 11/05/2006, 15h43
  5. Réponses: 3
    Dernier message: 20/11/2005, 20h04

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