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 :

Allocation de tableau de structure


Sujet :

C

  1. #1
    Membre éclairé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Par défaut Allocation de tableau de structure
    Bonjour,

    J'ai un petit souci de compréhension on dirait bien. Le compilateur braille en me disant :

    error: invalid type argument of '->' (have 't_armee')

    pour la fonction suivante. Les erreurs provenant des lignes surlignées de la même couleur.

    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
    27
    28
    29
    t_armee *allouerArmee( int *quantite )
    {
        t_armee *armee = (t_armee*)malloc(2*sizeof(t_armee));
    
        if ( armee != NULL )
        {
            int i,j;
            for ( i=0 ; i<2 ; i++)
            {
                if ( i==0 )
                {
                    for ( j=0 ; j<quantite[i] ; j++)
                    {
                        armee[i]->peloton[j] = (t_peloton*)malloc(sizeof(t_peloton));
                    }
                }
    
                else
                {
                    for ( j=0 ; j<quantite[i] ; j++)
                    {
                        armee[i]->peloton[j] = (t_peloton*)malloc(sizeof(t_peloton));
                    }
                }
            }
        }
    
        else perror("\n allouerArmee : ");
    }
    J'aurais aimé aussi pouvoir tester l'allocation de chaque champs. Mais je ne sais pas comment m'y prendre proprement.

    Merci d'avance !

  2. #2
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 10
    Par défaut
    Salut !

    armee est bien un pointeur, mais par armee[i]. D'ou l'erreur. Du dois écrire armee[i].peloton[j].

  3. #3
    Membre éclairé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Par défaut
    J'avais essayé mais cela ne marchait pas non plus !

    Toujours sur les mêmes lignes le compilateur me renvoi ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error: incompatible types when assigning to type 't_peloton' from type 'struct t_peloton *'|

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Et si tu nous montrais t_peloton ?...

  5. #5
    Membre émérite
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Par défaut
    Je suppose que peloton est un t_peloton alors
    ça n'est pas plutot ça que tu voulais faire :
    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
     
    t_armee *allouerArmee( int *quantite )
    {
        t_armee *armee = malloc(2*sizeof(t_armee));
     
        if ( armee != NULL )
        {
            int i;
            for ( i=0 ; i<2 ; i++)
            {            
    	armee[i].peloton = (t_peloton*)malloc(quantite[i]*sizeof(t_peloton));            
            }
        }
     
        else perror("\n allouerArmee : ");
    }
    car la tu essaye d'affecter un pointeur t_peloton a un t_peloton

  6. #6
    Membre éclairé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Par défaut
    Non parceque chaque armée dispose de différents pelotons

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    /* structure representant une unité */
    typedef struct
    {
        int quantite;
        int type;
        int forceUnitaire;
        int force;
    }t_peloton;
     
    /* structure representant une armée composée d'unités */
    typedef struct
    {
        t_peloton *peloton;
    }t_armee;

  7. #7
    Membre émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Par défaut
    Tu n'as pas alloué de mémoire pour 'peloton' donc accéder à 'peloton[j]' revient à accéder à... n'importe où. Il te manque un malloc.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    armee[i].peloton = malloc(....);
    De plus, si tu as un pointeur 'simple' et non pas un pointeur sur pointeur tu n'as pas à allouer de mémoire pour 'armee[i].peloton[j]'.

  8. #8
    Membre éclairé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Par défaut
    En fait dans une armée il y a différents pelotons et cela est dynamique d'où l'utilisation d'un pointeur sur t_peloton. Je peux très bien avoir armee0 avec 5 pelotons et armee1 avec 2 pelotons. Alors je ne suis pas sûr de bien comprendre ce que tu m'expliques ici :

    De plus, si tu as un pointeur 'simple' et non pas un pointeur sur pointeur tu n'as pas à allouer de mémoire pour 'armee[i].peloton[j]'.


    Concernant l'allocation des pelotons, oui en effet faudrait peut être les allouer.
    D'où la modification suivante :

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    t_peloton *allouerPeloton ( int *quantite, int armee )
    {
        t_peloton *peloton = (t_peloton*)malloc( quantite[armee]*sizeof(t_peloton) );
     
        if ( peloton != NULL )
        {
            return peloton;
        }
     
        else perror("\n allouerPeloton : ");
    }
     
    t_armee *allouerArmee( int *quantite )
    {
        t_armee *armee = (t_armee*)malloc(2*sizeof(t_armee));
     
        if ( armee != NULL )
        {
            int i,j;
            for ( i=0 ; i<2 ; i++)
            {
                if ( i==0 )
                {
                    t_peloton *peloton = allouerPeloton( quantite, 0 );
                    for ( j=0 ; j<quantite[i] ; j++)
                    {
                        armee[i].peloton[j] = (t_peloton*)malloc(sizeof(t_peloton));
                    }
                }
     
                else
                {
                    t_peloton *peloton = allouerPeloton( quantite, 1 );
                    for ( j=0 ; j<quantite[i] ; j++)
                    {
                        armee[i].peloton[j] = (t_peloton*)malloc(sizeof(t_peloton));
                    }
                }
            }
        }
     
        else perror("\n allouerArmee : ");
    }
    La grosse blague c'est que le compilateur me sort toujours la même erreur.
    Merci.

  9. #9
    Membre émérite
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Par défaut
    Tu n'as rien compris aux pointeurs !

    armee[i].peloton est un pointeur, il peut pointer sur un tableau dynamique de t_peloton

    armee[i].peloton[x] est un t_peloton et tu tiens absoluement à lui affecter un pointeur.

    Donc tu aura toujours l'erreur.
    Et ça ce n'est pas une blague.

  10. #10
    Membre émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Par défaut
    Il te manque un pointeur si tu veux faire comme tu le fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    /* structure representant une armée composée d'unités */
    typedef struct
    {
        t_peloton **peloton;
    }t_armee;
    Note qu'il y aura aussi quelques modifications à faire dans ton code.

  11. #11
    Membre éclairé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Par défaut
    Ah oui en effet, les structures je galère un peu, ce pourquoi je fais cela. Donc remarque pertinente.

    Si j'ai bien compris mon erreur cette fois, je suppose que cela devrait être correct. En tout cas cette fois ci, ça compile !

    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
    t_peloton *allouerPeloton( t_armee *armee, int *quantite, int idArmee )
    {
        armee[idArmee].peloton = (t_peloton*)malloc(quantite[idArmee]*sizeof(t_peloton));
     
        if ( armee[idArmee].peloton != NULL )
        {
            return armee[idArmee].peloton;
        }
     
        else perror("\n allouerPeloton");
    }
     
    t_armee *allouerArmee( int *quantite )
    {
        t_armee *armee = (t_armee*)malloc(2*sizeof(t_armee));
     
        if ( armee != NULL )
        {
     
                armee[0].peloton = allouerPeloton( armee, quantite, 0 );
     
                armee[1].peloton = allouerPeloton( armee, quantite, 1 );
        }
     
        else perror("\n allouerArmee : ");
    }

  12. #12
    Membre éclairé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Par défaut
    Citation Envoyé par Pouet_forever Voir le message
    Il te manque un pointeur si tu veux faire comme tu le fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    /* structure representant une armée composée d'unités */
    typedef struct
    {
        t_peloton **peloton;
    }t_armee;
    Note qu'il y aura aussi quelques modifications à faire dans ton code.
    Oui car je fais de l'allocation dans une fonction, et pour que l'allocation soit existante en revenant je devrais passer par adresse & la variable peloton d'ou le ** ? c'est bien ça ?

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 08/10/2013, 18h27
  2. Allocation dynamique d'un tableau de structure
    Par TheChicken dans le forum Débuter
    Réponses: 20
    Dernier message: 12/05/2011, 18h11
  3. tableau de structure et allocation dynamique
    Par libliba dans le forum Débuter
    Réponses: 3
    Dernier message: 14/04/2011, 15h02
  4. Allocation dynamique d'un tableau de structures
    Par ryadh.naouar dans le forum C
    Réponses: 5
    Dernier message: 24/04/2008, 13h49
  5. Allocation dynamique tableau dans structure
    Par chental dans le forum C
    Réponses: 2
    Dernier message: 03/08/2006, 10h03

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