2

C 構造体に関する宿題の問題がいくつかあります...誰かが助けてくれれば。わからないから。

作業コードにはこれらのビットが含まれています (方向を含む頭を持つヘビのゲームです):

game_t *game = …;

game->snake.head->direction = …;
snake_info(game->snake)
snake_destroy(&(game->snake));

プロトタイプ (どうやら変更できないようです):

void snake_info(snake_t const *snake);
void snake_destroy(snake_t *snake);

そして、私が構築しようとしている構造。

typedef struct game {
    snake_t snake; // to match call to snake_destroy and direction assignation
    // or
    snake_t *snake; // to match call to snake_info
} game_t;

しかし、両方を同時に機能させることはできません。

編集:実際にはstructが呼び出されました。明らかな何かを見逃しているのでしょうか、それともそれらのプロトタイプ (または呼び出し) に問題がありますか?snakegame

編集2:

最初の解決策でのコンパイラ エラーsnake_t snake( 内game):

snake.c: In function ‘game_print’:
snake.c:244:5: erreur: incompatible type for argument 1 of ‘snake_info’
gamecore.c:20:6: note: expected ‘const struct snake_t *’ but argument is of type ‘snake_t’

2 番目のソリューション ̀ snake_t *snake` でのコンパイラ エラー:

snake.c: In function ‘game_destroy’:
snake.c:205:5: attention : passing argument 1 of ‘snake_destroy’ from incompatible pointer type
gamecore.c:54:6: note: expected ‘struct snake_t *’ but argument is of type ‘struct snake_t **’
4

3 に答える 3

0

構造体が正しくありません。同じ名前の 'snake' を持つメンバーが 2 人います

正当なコードを許可するために、両方とも構造体のスコープ内で一意の名前を持つ必要があります

于 2012-04-26T18:32:00.320 に答える
0

コンパイラ エラーはすべてを示しています。次を使用して構造体を定義する必要がありますstruct snake_t

typedef struct game {
    struct snake_t snake;
} game_t;

指定されたコード内で使用する必要がsnake_t snakeあります。snake.head

于 2012-04-26T19:17:28.340 に答える
-1

ポインタが使用される場所には少し混乱があります。より多くの練習をすることで、ポインタを使用することがより自然になります。

また、構造体の名前と競合しない変数名を使用してください。


コードで必要なポインターの使用量によって異なります。

既存のコードへの最小限の編集:

typedef struct game {
    snake_t snake; // A snake_t instance is created with the game instance.. 
} game_t;

-

game_t *game = …;

game->snake.head->direction = …;

// snake_info requires a snake_t reference so pass the address of game->snake
//snake_info(game->snake);
snake_info(&(game->snake));
snake_destroy(&(game->snake));


最小限のポインタ:

typedef struct game {
    snake_t snake; // A snake_t instance is created with the game instance.. 
} game_t;

-

// Use a game_t variable instead of a pointer
//game_t *game = …;
game_t aGame = …; // renamed variable to avoid conflicts

// change the snake.head to snake->head since the game object uses a snake_t pointer
// game->snake.head->direction = …;
aGame.snake.head->direction = …; 


// Pass the address of aGame.snake 
snake_info(&(aGame.snake));

// this line is okay since you pass the address of game->snake.
snake_destroy(&(aGame.snake));


ポインタをさらに活用する:

typedef struct game {
    snake_t *snake; // A pointer to a snake_t instance. 
} game_t;

-

// Create a game_t instance
game_t aGame = …;

// Create a snake_t instance
snake_t aSnake = ... ;


// Create a game_t pointer and assign it the address of aGame
game_t *aGamePtr = &aGame;

// Using aGamePtr, assign the snake variable in aGame the address of aSnake
aGamePtr->snake = &aSnake;


// Since the game_t object is a snake_t pointer,
// change the snake.head to snake->head 
// game->snake.head->direction = …;
aGamePtr->snake->head->direction = …; 


// this line is okay since aGamePtr->snake is a pointer.
snake_info(aGamePtr->snake);

// Since game object uses a snake_t pointer, pass aGamePtr->snake directly
// snake_destroy(&(game->snake));
snake_destroy(aGamePtr->snake);
于 2012-04-26T21:35:49.247 に答える