2012-04-26 25 views
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被称为snake而它实际上是game。 我是否错过了某些显而易见的东西,或者这些原型(或调用)有问题吗?

编辑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’ 

编译器误差与第二溶液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 **’ 
+0

能否请您提供的编译器或您的错误消息(缩短)输出?你必须使用第二种形式,因为你使用的是'snake.head'而不是'snake-> head'。 – 2012-04-26 18:50:50

+0

错误补充,谢谢你的帮助。 – greut 2012-04-26 19:06:15

回答

0

你的结构不正确。你有两个名称相同的“蛇”

两个必须的结构范围内具有唯一的名称两名成员,允许法人代码

+0

他们之间有一个*或*。我正在寻找定义该结构以适应所需用例的方式。 – greut 2012-04-26 18:35:55

+1

表单1是你的结构是正确的版本。但是你错误地调用了snake_info()。正确的调用是snak_info(&game-> snake) – user590028 2012-04-27 10:47:20

0

编译器错误说,这一切,你必须定义使用struct snake_t你的结构:

typedef struct game { 
    struct snake_t snake; 
} game_t; 

你必须给定的代码中使用,因为snake.headsnake_t snake

-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); 
+0

这与问题没有关系。你正在改变的代码是给出的,他必须使用它。 – 2012-04-27 05:35:54