Partage
  • Partager sur Facebook
  • Partager sur Twitter

déréférencement d'un pointeur de type incomplet

Sujet résolu
    20 mai 2018 à 17:05:10

    Bonjour ,

    Je souhaite réaliser le jeu redkite en C.

    Cependant, je n'arrive pas à initialiser mes structures...

    Le code de mon .c compile (voir ci dessous)

     struct cycliste_t
     {
       int piste;
       int position;
     };
    
     struct deck_t {
         int count; // Number of cards of this deck
         int cards[MAX_CARDS]; // Actual cards as `int`
     };
    
    
     struct discardable_deck_t {
         struct deck_t *deck;
         struct deck_t *discard;
     };
    
     struct player_t
     {
       struct cycliste_t *coureur;
       struct cycliste_t *sprinter;
       struct discardable_deck_t * decks[2];
     };
    
    
     struct cycliste_t* init_cyclist()
     {
       struct cycliste_t* cycliste = malloc(sizeof(struct cycliste_t));
       cycliste->piste=0;
       cycliste->position=-1;
       return cycliste;
     }
    
     struct deck_t* init_deck()
     {
       struct deck_t *deck = malloc(sizeof(struct deck_t));
       return deck;
     }
    
    struct discardable_deck_t* init_disc()
    {
      struct discardable_deck_t* discardable_deck = malloc(sizeof(*discardable_deck));
      discardable_deck -> deck = init_deck();
      discardable_deck -> discard = init_deck();
      return discardable_deck;
    }
    
    struct player_t* init_partie()
     {
       struct player_t* player = malloc(sizeof(struct player_t));
       player->coureur = init_cyclist();
       player->sprinter = init_cyclist();
       player->decks[0] = init_disc();
       player->decks[1] = init_disc();
       struct deck_t pioche_rouleur = { .count = 15, .cards = {3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7}};
       struct deck_t pioche_sprinter = { .count = 15, .cards = {2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 9, 9, 9}};
    
       player->decks[0]->deck = &pioche_rouleur; //0 = ROULEUR
       //player->decks[0]->discard = empty_deck();
       player->decks[1]->deck = &pioche_sprinter;
       //player->decks[1].discard = empty_deck();
       return player;
    
    
     }

     mais lorsque je veux tester ma fonction pour voir si elle fonctionne j'obtiens l'erreur  :

    In file included from test-redkite.c:3:0:
    redkite.h:47:44: attention : ‘struct race_t’ declared inside parameter list [enabled by default]
     void mouvement(struct race_t *race, struct cycliste_t *cycliste); //fonction qui s'occupe de gérer le mouvement des cyclistes
                                                ^
    redkite.h:47:44: attention : visible uniquement depuis cette définition ou déclaration, ce qui n'est probablement pas ce que vous désirez [enabled by default]
    test-redkite.c: In function ‘main’:
    test-redkite.c:27:7: attention : implicit declaration of function ‘printf’ [-Wimplicit-function-declaration]
           printf(" %d",toto->coureur->piste);
           ^
    test-redkite.c:27:7: attention : incompatible implicit declaration of built-in function ‘printf’ [enabled by default]
    test-redkite.c:27:24: erreur: déréférencement d'un pointeur de type incomplet
           printf(" %d",toto->coureur->piste);
                            ^
    test-redkite.c:28:24: erreur: déréférencement d'un pointeur de type incomplet
           printf(" %d",toto->decks[1]->deck->cards[i]);
                            ^
    make: *** [test-redkite.o] Erreur 1
    



    Le code de mon test est pourtant assez simple :

    int main()
    {
      struct player_t* toto = init_partie();
      for (int i=0;i<5;i++)
      {
          printf(" %d",toto->coureur->piste);
          printf(" %d",toto->decks[1]->deck->cards[i]);
          //printf("%d",player->decks[0].discard.cards[i]);
          //printf("%d",player.decks[1].discard.cards[i]);
      }
      return 0;
    }


    Je n'arrive pas à corriger l'erreur. Si quelqu'un a une idée cela me serait d'une grande aide.

    Merci d'avance.

    • Partager sur Facebook
    • Partager sur Twitter
      20 mai 2018 à 17:50:43

      Salut,

      Corriger tes warnings est important, tu devrais les corriger autant (ou au moins considérer si les warnings sont intentionnels) que les erreurs.

      Ensuite, dans init_disc je te conseilles de malloc sur ta structure et non sur ta variable

      Enfin la carte que tu souhaite afficher n'a pas été initialisée

      • Partager sur Facebook
      • Partager sur Twitter

      J'aime les bandes dessinées, manhuas, manhwas, mangas, comics... Du coup j'ai fait aralosbd.fr !

        20 mai 2018 à 18:03:06

        Tout d'abord merci de votre réponse.

        J'ai corrigé les warnings et l'erreur sur la malloc.

        Par contre qu'entendez vous par initialiser la carte que je veux afficher ?

        Je remets l'erreur au cas où :

        morphine:~/Projetif112/if112-groupee-4508/src/redkite > make test-redkite
        cc -std=c99 -Wall -Wextra -MMD   -c -o test-redkite.o test-redkite.c
        test-redkite.c: In function ‘main’:
        test-redkite.c:25:14: erreur: déréférencement d'un pointeur de type incomplet
           int a =toto->piste;
                      ^
        test-redkite.c:27:20: erreur: déréférencement d'un pointeur de type incomplet
           printf(" %d",toto->position);
                            ^
        make: *** [test-redkite.o] Erreur 1
        morphine:~/Projetif112/if112-groupee-4508/src/redkite > 
        

        et la partie du code qui a changé

        struct discardable_deck_t* init_disc()
        {
          struct discardable_deck_t* discardable_deck = malloc(sizeof(struct discardable_deck_t));
          discardable_deck -> deck = init_deck();
          discardable_deck -> discard = init_deck();
          return discardable_deck;
        }
        
        struct player_t* init_partie()
         {
           struct player_t* player = malloc(sizeof(struct player_t));
           player->coureur = init_cyclist();
           player->sprinter = init_cyclist();
           player->decks[0] = init_disc();
           player->decks[1] = init_disc();
           struct deck_t pioche_rouleur = empty_deck();
           struct deck_t pioche_sprinter = empty_deck();
           pioche_rouleur = { .count = 15, .cards = {3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7}};
           pioche_sprinter = { .count = 15, .cards = {2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 9, 9, 9}};
        
           player->decks[0]->deck = &pioche_rouleur; //0 = ROULEUR
           //player->decks[0]->discard = empty_deck();
           player->decks[1]->deck = &pioche_sprinter;
           //player->decks[1].discard = empty_deck();
           return player;
        
        
         }




        • Partager sur Facebook
        • Partager sur Twitter
          20 mai 2018 à 19:10:16

          C'est marrant parce que ton main ne correspond pas à ce que dit ton erreur..

          Dans ton erreur, un toto->piste est utilisé alors que piste ne fait pas partie de la structure

          Et à propos de ce que je te disais, quand tu veux afficher une variable, il faut qu'elle ait une valeur, sinon c'est sale

          • Partager sur Facebook
          • Partager sur Twitter

          J'aime les bandes dessinées, manhuas, manhwas, mangas, comics... Du coup j'ai fait aralosbd.fr !

            20 mai 2018 à 19:17:00

            Est-ce que ce fichier de code (code de test) contient bien un #include du fichier d'entete où figurent les déclarations ?

            De manière générale, si tu ne trouves pas les erreurs, c'est qu'elles ne sont sans doute pas là où tu les cherches. Et donc ça serait mieux que tu présentes tes codes en entier, pas seulement des bouts sélectionnés dans lequels tu crois qu'il y a l'erreur.

            -
            Edité par michelbillaud 20 mai 2018 à 19:20:48

            • Partager sur Facebook
            • Partager sur Twitter
              20 mai 2018 à 23:04:46

              Alala je suis un idiot ...

              J'avais déplacé mes structures directement dans mon .c parce que j'avais des problèmes de référence multiple à cause de tous mes include.h

              Mais du coup impossible de les utiliser dans mon test.c.

              Merci à vous deux d'avoir trouvé mon erreur j'arrivais plus à voir clair après y avoir passé presque une dizaine d'heures.

              Pour ceux qui auraient le même genre de problème, vérifiez bien que vos includes et vos .h sont bien définis et au bonne endroit !

              Merci encore,

              Romain

              • Partager sur Facebook
              • Partager sur Twitter
                20 mai 2018 à 23:31:22

                Les problèmes de référence multiple, il suffit d'ajouter quelques lignes au début et à la fin pour les éviter :

                #ifndef TOTO_H
                #define TOTO_H
                
                // contenu du fichier toto.h
                
                
                
                
                
                
                
                #endif
                



                -
                Edité par michelbillaud 21 mai 2018 à 16:15:08

                • Partager sur Facebook
                • Partager sur Twitter
                  21 mai 2018 à 11:45:51

                  Ou alors un peu plus court

                  #pragma once
                  
                  // Ce que tu veux, ne sera inclus q'une fois



                  • Partager sur Facebook
                  • Partager sur Twitter

                  J'aime les bandes dessinées, manhuas, manhwas, mangas, comics... Du coup j'ai fait aralosbd.fr !

                    21 mai 2018 à 16:14:46

                    plus court, mais pas standard.

                    • Partager sur Facebook
                    • Partager sur Twitter

                    déréférencement d'un pointeur de type incomplet

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown