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 :

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


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2018
    Messages : 2
    Points : 1
    Points
    1
    Par défaut déréférencement d'un pointeur de type incomplet
    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)

    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    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(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;
     
     
     }
     
     
     
     int NBR_PIOCHE = 4;
     int NBR_JOUEUR = 4;
     int val_fatigue = 2;
     enum cyclist_t choix = ROULEUR;
     
     int init_random()
     {
         char *val = getenv("SEED");
         int seed = val ? atoi(val) : time(NULL);
         srand(seed);
         return seed;
     }
    mais lorsque je veux tester ma fonction pour voir si elle fonctionne j'obtiens l'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    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
    Le code de mon test est pourtant assez simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int main() //test de l'initialisation
    {
      struct cycliste_t* toto = init_cyclist();
      int a =toto->piste;
      printf(" %d",a);
      printf(" %d",toto->position);
      //printf("%d",player->decks[0].deck.cards[5]);
          //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.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Un type incomplet veut dire que c'est un pointeur vers un type non défini (mais éventuellement déclaré avec une déclaration avancée/ anticipée - "forward declaration" (<- lien wiki français))

    Il te manque un include quelque part.

    Renseigne-toi, en C, sur l'inclusion, les "include guards" et les unités de compilation. Il te manque apparemment toutes ces notions

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2018
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    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 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 super forum au passage,

    Romain

  4. #4
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Afin de mieux appréhender l'arbre d'inclusion de ton projet, tu peux éventuellement demander au compilateur d'afficher un message lorsqu'il atteint une ligne donnée à la compilation, par exemple pour GCC (clic !) :

    Code foobar.h : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #if !defined(INCL_FOOBAR_H)
      #define INCL_FOOBAR_H
     
    #pragma message "parser reached beginning of " __FILE__
     
     ...
     
    #pragma message "parser reached end of " __FILE__
     
    #endif // INCL_FOOBAR_H

    Souviens-toi seulement de n'y recourir que le temps de prendre le pli du fonctionnement du système. Ce ne sont pas des outils normalisés et on en a rarement l'usage en « production ».

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    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 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Novas7 Voir le message
    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
    Bonjour

    Pour pallier à ce souci, on a généralement l'habitude de mettre une sentinelle dans les ".h". A la première inclusion la sentinelle est activée, et à la seconde, comme elle est déjà activée l'inclusion ne fait plus rien

    Exemple (toto.h)
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #ifndef _TOTO_H_
    #define _TOTO_H_
    ... (déclaration des structures, des types, des fonctions)...
    #endif // _TOTO_H_

    Seule la première inclusion de "toto.h" activera toutes les déclarations...
    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]

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 07/12/2012, 15h24
  2. Réponses: 3
    Dernier message: 28/11/2012, 16h16
  3. Réponses: 8
    Dernier message: 07/06/2010, 21h22
  4. déréférencement d'un pointeur de type incomplet
    Par ikuzar dans le forum Débuter
    Réponses: 1
    Dernier message: 07/09/2009, 18h37
  5. déréférencement d'un pointeur de type incomplet
    Par pauligno dans le forum Débuter
    Réponses: 8
    Dernier message: 10/12/2007, 10h50

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