Я реализую карточную игру в C. Существует много типов карт, и у каждого есть набор информации, включая некоторые действия, которые должны будут быть индивидуально заданы сценарием связанные с нею.
Учитывая структуру как это (и я не уверен, что имею право синтаксиса для указателя функции),
struct CARD {
int value;
int cost;
// This is a pointer to a function that carries out actions unique
// to this card
int (*do_actions) (struct GAME_STATE *state, int choice1, int choice2);
};
Я хотел бы инициализировать статический массив их, один для каждой карты. Я предполагаю, что это выглядело бы примерно так
int do_card0(struct GAME_STATE *state, int choice1, int choice2)
{
// Operate on state here
}
int do_card1(struct GAME_STATE *state, int choice1, int choice2)
{
// Operate on state here
}
extern static struct cardDefinitions[] = {
{0, 1, do_card0},
{1, 3, do_card1}
};
Это будет работать, и я иду об этом правильным путем вообще? Я стараюсь избегать огромных чисел операторов переключения.
Я должен определить функции 'do_cardN' заранее, или есть ли некоторый способ определить их встроенный в инициализации структуры (что-то как лямбда функционирует в Python)?
Мне будет нужен доступ только для чтения к cardDefinitions из другого файла - действительно ли ' экстерн, статично' корректный для этого?
Я знаю, что это - много вопросов одновременно, но я действительно немного неопределенен о том, как пойти об этом.
Спасибо.
Править:
Чтобы быть ясной, моя цель состоит в том, чтобы смочь сделать что-то как
int cost = cardDefinitions[cardNumber].cost;
или
int result = cardDefinitions[cardNumber].do_action(state, choice1, choice2);
Вместо того, чтобы использовать огромные операторы переключения повсеместно.
Ваш подход совершенно правильный.
switch
. extern
- это то, что вам нужно, а не static
. Измените свое тело на следующее:
struct CARD cardDefinitions [] = {
{0, 1, do_card0},
{1, 3, do_card1}
};
затем в соответствующем файле заголовка:
extern struct CARD cardDefinitions [];
Ваш подход правильный и будет работать. Синтаксис указателя на функцию правильный, за исключением того, что вы не используете имена параметров - только типы:
int (*do_actions)(struct GAME_STATE *, int, int);
Это должно работать нормально. Кажется, что у вас будет много функций, если вы выполняете по одной для каждой карты, но, возможно, эта конкретная игра требует такого уровня контроля
. Вы не можете определить их встроенными, но вы можете просто сделать предварительное объявление. Вам нужно сделать & func_name
в инициализации структуры, хотя
Нет; extern
означает, что переменная объявлена в другом файле, поэтому нет смысла иметь переменную extern, которую вы объявляете в этом месте. Кроме того, static
означает, что переменная доступна только из текущего файла, что противоположно тому, что вы хотите. Чтобы сделать его доступным только для чтения, потребуется функция-получатель, но если вы просто хотите сделать его доступным из другого файла, обычно объявите его здесь ( struct cardDefinitions [] = {...}
) и в другом файле. используйте extern ( extern struct cardDefinitions [];
)