Инициализируйте статический массив структур в C

Я реализую карточную игру в 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}
};
  1. Это будет работать, и я иду об этом правильным путем вообще? Я стараюсь избегать огромных чисел операторов переключения.

  2. Я должен определить функции 'do_cardN' заранее, или есть ли некоторый способ определить их встроенный в инициализации структуры (что-то как лямбда функционирует в Python)?

  3. Мне будет нужен доступ только для чтения к cardDefinitions из другого файла - действительно ли ' экстерн, статично' корректный для этого?

Я знаю, что это - много вопросов одновременно, но я действительно немного неопределенен о том, как пойти об этом.

Спасибо.

Править:

Чтобы быть ясной, моя цель состоит в том, чтобы смочь сделать что-то как

int cost = cardDefinitions[cardNumber].cost;

или

int result = cardDefinitions[cardNumber].do_action(state, choice1, choice2);

Вместо того, чтобы использовать огромные операторы переключения повсеместно.

33
задан russell_h 22 June 2010 в 21:37
поделиться

3 ответа

Ваш подход совершенно правильный.

  1. Это будет работать, и это хороший способ избежать огромных операторов switch .
  2. Вы не можете определять встроенные функции в C, каждая из них должна иметь уникальное имя.
  3. extern - это то, что вам нужно, а не static . Измените свое тело на следующее:

     struct CARD cardDefinitions [] = {
     {0, 1, do_card0}, 
     {1, 3, do_card1} 
    }; 
     

    затем в соответствующем файле заголовка:

     extern struct CARD cardDefinitions []; 
     
40
ответ дан 27 November 2019 в 18:33
поделиться

Ваш подход правильный и будет работать. Синтаксис указателя на функцию правильный, за исключением того, что вы не используете имена параметров - только типы:

int (*do_actions)(struct GAME_STATE *, int, int);
3
ответ дан 27 November 2019 в 18:33
поделиться
  1. Это должно работать нормально. Кажется, что у вас будет много функций, если вы выполняете по одной для каждой карты, но, возможно, эта конкретная игра требует такого уровня контроля

  2. . Вы не можете определить их встроенными, но вы можете просто сделать предварительное объявление. Вам нужно сделать & func_name в инициализации структуры, хотя

  3. Нет; extern означает, что переменная объявлена ​​в другом файле, поэтому нет смысла иметь переменную extern, которую вы объявляете в этом месте. Кроме того, static означает, что переменная доступна только из текущего файла, что противоположно тому, что вы хотите. Чтобы сделать его доступным только для чтения, потребуется функция-получатель, но если вы просто хотите сделать его доступным из другого файла, обычно объявите его здесь ( struct cardDefinitions [] = {...} ) и в другом файле. используйте extern ( extern struct cardDefinitions []; )

1
ответ дан 27 November 2019 в 18:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: