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 :

Accès aux membres d'une structure


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Accès aux membres d'une structure
    Voila, je crois que j'ai le même probleme, j'ai une structure qui pointe sur une autre structure d'un autre genre, et je veux acceder aux données de la deuxième structure et je dois avouer que je suis un peu perdu dans le -> et les . pourtant il me semble que j'ai tout mallocé!
    je vous laisse mon code :
    la console m'affiche que dans le printf il y a une erreur "invalid of argument ->"
    quelqu'un peut juste m'expliquer comment je dois ecrire pour acceder à ce je veux?
    Merci d'avance!!!

    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
     
    typedef struct cartes
    {
        int clic; //passe à 1 si premier clique
        int reception; //passe à un si on clique la carte la deuxieme fois
    }t_carte;
     
    typedef struct box1
    {
        t_carte *cartes[53];
        t_carte *clone;
    }t_box;
     
    int main(int argc, char **argv)
    {
     t_carte *ordre[53];
    t_box *box;
    box=malloc(1*(sizeof(t_box)));
    for (i=1;i<53;i++)
        {
           ordre[i]=malloc(1*sizeof(t_carte));
            box->cartes[i]=malloc(1*sizeof(t_carte));
     
        }
     for(i=1;i<53;i++)
        {
            box->cartes[i]=&ordre[i];
            printf("\n box->clic %i\n",(bloc->cartes[i])->clic);
        }
    }

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    Salut, il y a plusieurs problèmes dans ton main.

    Tout d'abord, tu n'as jamais déclaré le int i. Ensuite, tu démarres toujours i à 1 (dans le boucles for). Pourquoi ne fais-tu jamais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for(i = 0 ; i < 53 ; i++)
    {
     
    }
    Dans les malloc, tu fais qqch du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    box=malloc(1*(sizeof(t_box)));
    je préfère que tu fasses qqch du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    box=malloc(sizeof(*box));
    if(box == NULL)
    {
      // traitement de l'erreur
    }
    Autre point, ton code possède d'énormes fuite mémoire. A 2 endroits
    1) dans le main, tu ne fais jamais de free. A faire à la fin.
    2) tu as écrit (mes commentaires directement dans ton code) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    for (i=1;i<53;i++)
        {
           ordre[i]=malloc(1*sizeof(t_carte));
            box->cartes[i]=malloc(1*sizeof(t_carte)); // ici tu réserves de l'espace mémoire
     
        }
     for(i=1;i<53;i++)
        {
            box->cartes[i]=&ordre[i]; // ici tu fais une simple copie de pointeurs ! tu écrases donc ton pointeur que tu as alloué plus haut ! Si tu fais un free ensuit, ça va planter !
            printf("\n box->clic %i\n",(bloc->cartes[i])->clic);
        }
    Dernier point :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    printf("\n box->clic %i\n",(bloc->cartes[i])->clic);
    Faux, pour afficher un entier, c'est %d qu'il faut utiliser. Ca va donc donner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    printf("\n box->clic %d\n",bloc->cartes[i]->clic);
    Voilà pour un début...

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Merci pour tes conseils, mais en fait j'avais déjà fait tout ça, parce que mon code est beaucoup plus compliqué et j'ai juste rétréci à mon problème. Bon j'avais pas réalisé le free et je commence mon for à 1 parce que j'utilise la case 0 pour autre chose et j'ai bien créé le int i mais j'avais oublié de le mettre dans le code que j'ai copié :s
    Et entre la réservation en mémoire et la copie de pointeurs, j'initialise le tableau de carte.
    Je suis désolée en effet ça doit être difficile si vous avez pas le code entier mais il fait 3000 lignes et je n'ai que ce problème de mémoire qui bloque.
    Et pour le %d, j'ai vérifié et ça marche toujours pas (d'ailleurs j'ai toujours fait avec des %i et ça a toujours marché, mais a partir de maintenant je ferai plus attention)

  4. #4
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    @salseropom :
    Faux, pour afficher un entier, c'est %d qu'il faut utiliser.
    Avec printf(), on peut utiliser indifféremment %d ou %i pour un int.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    Citation Envoyé par diogene Voir le message
    @salseropom :

    Avec printf(), on peut utiliser indifféremment %d ou %i pour un int.
    oups... désolé pour la fausse info que j'ai donnée et merci pour la tienne !

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    Citation Envoyé par chocomaria Voir le message
    Merci pour tes conseils, mais en fait j'avais déjà fait tout ça, parce que mon code est beaucoup plus compliqué et j'ai juste rétréci à mon problème. Bon j'avais pas réalisé le free et je commence mon for à 1 parce que j'utilise la case 0 pour autre chose et j'ai bien créé le int i mais j'avais oublié de le mettre dans le code que j'ai copié :s
    Et entre la réservation en mémoire et la copie de pointeurs, j'initialise le tableau de carte.
    Je suis désolée en effet ça doit être difficile si vous avez pas le code entier mais il fait 3000 lignes et je n'ai que ce problème de mémoire qui bloque.
    Et pour le %d, j'ai vérifié et ça marche toujours pas (d'ailleurs j'ai toujours fait avec des %i et ça a toujours marché, mais a partir de maintenant je ferai plus attention)
    OK, peux-tu STP nous envoyer l'erreur que tu as ? Comme ça, je ne vois pas où se trouve le problème...

  7. #7
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    En outre, mis à part :
    - l'utilisation de bloc->cartes[i]->clic au lieu de box->cartes[i]->clic
    - l'oubli d'un return 0 (par exemple) dans main
    - l'oubli de l'inclusion de stdio.h et stdlib.h
    - l'erreur dans box->cartes[i]=&ordre[i] qui devrait être box->cartes[i]=ordre[i];
    - la non initialisation du champ clic avant l'affichage
    je ne vois pas d'autres erreurs.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

Discussions similaires

  1. Accès aux membres d'une classe impossible
    Par couicsilver dans le forum C++
    Réponses: 5
    Dernier message: 18/03/2009, 11h21
  2. accès aux éléments d'une structure
    Par titou35 dans le forum Débuter
    Réponses: 4
    Dernier message: 05/03/2009, 09h23
  3. Accès aux membres d'une structure C
    Par Gulish dans le forum C++
    Réponses: 4
    Dernier message: 22/03/2008, 16h09
  4. Accès aux éléments d'une structure
    Par licorne dans le forum Pascal
    Réponses: 1
    Dernier message: 15/02/2007, 17h44
  5. Réponses: 5
    Dernier message: 01/02/2007, 13h14

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