2012-04-26 3 views
2

У меня есть проблемы с домашней работой с C struct ... если кто-то может быть вам полезен. Потому что я этого не понимаю.Определение правильной структуры на основе существующего кода

Рабочий код содержит те биты (Это игра со змеей, которая имеет головку, содержащую направление):

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; 

Но я не могу заставить обоих работать одновременно.

EDIT:struct называли snake в то время как на самом деле это game. Я пропустил что-то очевидное или есть проблема с этими прототипами (или вызовами)?

EDIT 2:

Компилятор ошибок с первым раствором snake_t snakegame):

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'. –

+0

ошибки добавлены, спасибо за помощь. – greut

ответ

0

Ваша структура неверна. У вас есть два члена и с тем же именем «змея»

Оба должны иметь уникальные имена в пределах объема структуры, чтобы разрешить Уложения

+0

есть a * or * между ними. Я ищу способ определить эту структуру, чтобы она соответствовала требуемым вариантам использования. – greut

+1

Форма 1 имеет вашу структуру, является правильной версией. Но вы неправильно вызываете snake_info(). Правильный вызов - snak_info (& game-> snake) – user590028

0

ошибка компилятор говорит, что это все, что вам нужно определить свой-структуру, используя struct snake_t :

typedef struct game { 
    struct snake_t snake; 
} game_t; 

Вы должны использовать snake_t snake из snake.head в пределах данного кода.

-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

Это не связано с вопросом. Код, который вы меняете, дается, он должен его использовать. –

Смежные вопросы