web-dev-qa-db-fra.com

Application non valide de sizeof à un type incomplet avec une structure

J'ai une structure où je mets toutes les informations sur les joueurs. Voilà ma structure:

struct player{
   int startingCapital;
   int currentCapital;
   int startingPosition;
   int currentPosition;
   int activePlayer; 
   int canPlay;      
};

Et c'est mon principal:

#include <stdio.h>
#include <stdlib.h>
#include "header.h"


int main(int argc, char *argv[])
{  int s,i,numOfPlayers;
   struct player *players;
    printf("Give the number of players: \n");
    scanf("%d",&numOfPlayers);

    players = (struct player *)calloc(numOfPlayers,sizeof(struct player));


   system("PAUSE"); 
  return 0;
}

Je demande à l'utilisateur de donner le nombre de joueurs, puis j'essaie d'allouer la mémoire nécessaire. Mais je reçois cette erreur de compilation que je ne peux pas comprendre:

invalid application of `sizeof' to incomplete type `player'  
28
captain

Cela signifie que le fichier contenant main n'a pas accès à la définition de la structure player (c'est-à-dire qu'il ne sait pas à quoi il ressemble).

Essayez de l'inclure dans header.h ou créer une fonction de type constructeur qui l'alloue si ce doit être un objet opaque.

MODIFIER

Si votre objectif est de masquer l'implémentation de la structure, faites-le dans un fichier C qui a accès à la structure:

struct player *
init_player(...)
{
    struct player *p = calloc(1, sizeof *p);

    /* ... */
    return p;
}

Cependant, si l'implémentation ne doit pas être masquée, c'est-à-dire que main doit légalement dire p->canPlay = 1 il serait préférable de mettre la définition de la structure dans header.h.

26
cnicutar

La cause d'erreurs telles que "Application non valide de sizeof à un type incomplet avec une structure ..." est toujours l'absence d'une instruction include. Essayez de trouver la bonne bibliothèque à inclure.

4
oiyio

Votre erreur s'affiche également lorsque vous essayez d'accéder à la sizeof() d'un tableau externe non initialisé:

extern int a[];
sizeof(a);
>> error: invalid application of 'sizeof' to incomplete type 'int[]'

Notez que vous obtiendrez un array size missing erreur sans le mot clé extern.

1
alexfrigo

Je pense que le problème est que vous mettez #ifdef au lieu de #ifndef en haut de votre header.h fichier.

0
morte69