Подтвердить что ты не робот

Инициализировать статический массив структур в 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}
};
  • Будет ли это работать, и я собираюсь сделать это правильно? Я пытаюсь избежать огромного количества операторов switch.

  • Нужно ли мне заранее определять функции do_cardN или есть способ определить их inline при инициализации структуры (что-то вроде лямбда-функции в python)?

  • Мне нужен доступ только для чтения к cardDefinitions из другого файла - это "extern static" для этого?

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

Спасибо.

Edit:

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

int cost = cardDefinitions[cardNumber].cost;

или

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

Вместо использования огромных операторов switch по всему месту.

4b9b3361

Ответ 1

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

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

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

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

    extern struct CARD cardDefinitions[];
    

Ответ 2

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

int (*do_actions)(struct GAME_STATE *, int, int);

Ответ 3

  • Это должно работать нормально. Кажется, что у вас будет много функций, если вы делаете по одному на карту, но, возможно, для этой конкретной игры требуется уровень контроля

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

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