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'
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.
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
.
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.
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
.
Je pense que le problème est que vous mettez #ifdef
au lieu de #ifndef
en haut de votre header.h
fichier.