44

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

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'  
4

6 に答える 6

38

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

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

編集

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

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

    /* ... */
    return p;
}

ただし、実装を非表示にすべきでない場合、つまり、構造の定義をに入れる方がmain法的に適切であると言う必要があります。p->canPlay = 1header.h

于 2012-01-18T18:20:17.797 に答える
7

「構造体を使用した不完全な型へのsizeofの無効な適用...」などのエラーの原因は、常にincludeステートメントがないことです。含める適切なライブラリを見つけてください。

于 2014-04-26T08:53:26.500 に答える
4

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

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

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

于 2018-03-30T09:05:44.923 に答える
0

問題は、ファイルの先頭では#ifdefなく、置くことだと思います。#ifndefheader.h

于 2012-07-04T19:16:41.120 に答える
0

私は初心者で、構文を明確にできない場合があります。上記の情報を参照するために、私はまだ明確ではありません。

/*
 * main.c
 *
 *  Created on: 15 Nov 2019
 */

#include <stdio.h>
#include <stdint.h>
#include <string.h>

#include "dummy.h"

char arrA[] = {
        0x41,
        0x43,
        0x45,
        0x47,
        0x00,
};

#define sizeA sizeof(arrA)

int main(void){

    printf("\r\n%s",arrA);
    printf("\r\nsize of = %d", sizeof(arrA));
    printf("\r\nsize of = %d", sizeA);

    printf("\r\n%s",arrB);
    //printf("\r\nsize of = %d", sizeof(arrB));
    printf("\r\nsize of = %d", sizeB);


    while(1);

    return 0;
};

/*
 * dummy.c
 *
 *  Created on: 29 Nov 2019
 */


#include <stdio.h>
#include <stdint.h>
#include <string.h>

#include "dummy.h"


char arrB[] = {
        0x42,
        0x44,
        0x45,
        0x48,
        0x00,
};

/*
 * dummy.h
 *
 *  Created on: 29 Nov 2019
 */

#ifndef DUMMY_H_
#define DUMMY_H_

extern char arrB[];

#define sizeB sizeof(arrB)

#endif /* DUMMY_H_ */

15:16:56 **** Incremental Build of configuration Debug for project T3 ****
Info: Internal Builder is used for build
gcc -O0 -g3 -Wall -c -fmessage-length=0 -o main.o "..\\main.c" 
In file included from ..\main.c:12:
..\main.c: In function 'main':
..\dummy.h:13:21: **error: invalid application of 'sizeof' to incomplete type 'char[]'**
 #define sizeB sizeof(arrB)
                     ^
..\main.c:32:29: note: in expansion of macro 'sizeB'
  printf("\r\nsize of = %d", sizeB);
                             ^~~~~

15:16:57 Build Failed. 1 errors, 0 warnings. (took 384ms)

「arrA」と「arrB」の両方にアクセスできます(印刷してください)。ただし、「arrB」のサイズを取得することはできません。

そこの問題は何ですか?

  1. 'char []'は不完全な型ですか?また
  2. 'sizeof'はextern変数/ラベルを受け入れませんか?

私のプログラムでは、「arrA」と「arrB」は定数リストであり、コンパイルする前に修正されています。ラベルを使用したい(メンテナンスとRAMメモリの節約を簡単にできるようにする)。

于 2019-12-03T07:33:55.310 に答える
0

ここでのパーティーには本当に遅れていますが、上記で引用したこのエラーの理由の特殊なケースは、構造が定義されている上記のsizeof()で構造を参照することです。

int numElements = sizeof(myArray)/sizeof(myArray[0]);
.
.
.
myArray[] = 
{
    {Element1},
    {Element2},
    {Element3}
};
于 2022-02-08T23:21:32.840 に答える