web-dev-qa-db-ja.com

構造体を持つ不完全な型へのsizeofの無効な適用

プレイヤーに関するすべての情報を置く構造体があります。それが私の構造です:

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

それが私のメインです:

#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;
}

ユーザーにプレイヤーの数を指定するように依頼し、必要なメモリを割り当てようとします。しかし、私は理解できないこのコンパイラエラーを受け取っています:

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

これは、mainを含むファイルがplayer構造体定義にアクセスできないことを意味します(つまり、どのように見えるかがわかりません)。

header.hに含めるか、不透明なオブジェクトである場合に割り当てるコンストラクタのような関数を作成してください。

編集

構造体の実装を非表示にすることが目的の場合、構造体にアクセスできるCファイルでこれを実行します。

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

    /* ... */
    return p;
}

ただし、実装を非表示にしない場合、つまりmainが法的にp->canPlay = 1と言う必要がある場合は、構造の定義をheader.hに配置することをお勧めします。

26
cnicutar

「structofを持つ不完全な型へのsizeofの無効な適用」などのエラーの原因は、常にincludeステートメントの欠如です。適切なライブラリを見つけてください。

4
oiyio

初期化されていない外部配列のsizeof()にアクセスしようとすると、エラーも表示されます。

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

externキーワードなしでarray size missingエラーが発生することに注意してください。

1
alexfrigo

問題は、#ifdef の代わりに #ifndefの上部header.hファイル。

0
morte69