1

構造体の実装を隠そうとしています。構造体の定義は次の場所にありBoard.hます。

typedef struct Board* BoardP;
typedef const struct Board* ConstBoardP;

そして、必要に応じてメモリを割り当てたいBoard.c:

#include <stdio.h>
#include <stdlib.h>
#include "Board.h"
#define TARGET_LENGTH 5
#define DEFAULT_BOARD_SIZE 10

 struct Board*
 newBoard(int r, int c)
{
    struct Board *b = (struct Board*) malloc(sizeof(struct Board));

     char ** array;
     int i;
     array = (char**) malloc( r*sizeof(char*) );
     for (i=0; i<r; i++)
     {
        array[i] = malloc( c*sizeof(char) );
     }
     b->_values = array;
     b->_last_player = 'X';
     b->_size_r = r;
     b->_size_c = c;
    return b;
}

しかし、私はエラーが発生しています:

不完全なタイプ「struct Board」への「sizeof」の無効な適用</p>

ここに画像の説明を入力

私は今何時間もぐるぐる回っていて、私が作った混乱から頭を片付けてくれる人が必要です. 構造体内の配列にメモリを動的に割り当てたい場合、構造体を事前に定義するにはどうすればよいですか?

4

3 に答える 3

4

最初に構造を定義する必要があります。BoardBoard.c

//Board.c
struct Board {
 ....
};

または、#includeとにかくBoard.c、コンパイラがその定義を確認して、そのメンバーを使用するときにそのサイズを決定し、sizeof()そのメンバーにアクセスする必要があります。ウィキペディアのページにも例があります。

于 2012-11-29T14:05:09.767 に答える
2

あなたは実際に定義を行うのを忘れているようです。それはどこかに行かなければなりませんよね?

のコードは、newBoard次のようなことを行っているため、正確な定義にアクセスできる必要があります。

b->_values = array;

struct Board型に というメンバーがあることを示す宣言が必要_valuesです。

また、Cの戻り値をキャストしないmalloc()でください。そして、 の使用は避けてくださいsizeof (char)。これは、長ったらしい書き方です1(もちろん、それほど頻繁に掛ける必要はありません)。

于 2012-11-29T14:07:02.350 に答える
1

sizeof不透明な(不完全な)タイプでは使用できません。

動的割り当てを使用しているため、不透明(OPAQUE)型のinit関数内で割り当てを移動することを検討する必要があります。

Board* BoardInit (...)
{
  Board* something = malloc(...);

  return something ;
}

別の方法は、board.hでグローバル定数を宣言してからextern const size_t sizeof_Board;、board.cでそれをとして定義することconst size_t sizeof_Board = sizeof(Board)です。

また、ポインタをtypedefすることは決してありません。不透明(OPAQUE)型も例外ではありません。

于 2012-11-29T14:54:40.393 に答える