在C中初始化结构的静态数组

时间:2010-04-14 22:20:02

标签: c arrays static struct

我在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中的lambda函数)?

    < / LI>
  3. 我需要从另一个文件对cardDefinitions进行只读访问 - 对于那个'extern static'是否正确?

  4. 我知道这是很多问题,但我真的有点模糊不清。

    感谢。

    编辑:

    要明确,我的目标是能够做类似

    的事情
    int cost = cardDefinitions[cardNumber].cost;
    

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

    而不是在所有地方使用巨大的开关语句。

3 个答案:

答案 0 :(得分:37)

你的方法是完全正确的。

  1. 这将有效,并且是避免大量switch语句的好方法。
  2. 您无法在C中内联定义函数,它们每个都必须具有唯一的名称。
  3. extern是你想要的,而不是static。改变你的身体:

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

    然后在适当的头文件中:

    extern struct CARD cardDefinitions[];
    

答案 1 :(得分:3)

您的方法是正确的,并且会起作用。你的函数指针语法是正确的,除了你不使用参数名称 - 只是类型:

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

答案 2 :(得分:1)

  1. 这应该可以正常工作。看起来你有很多功能,如果你每张卡一个,但也许这个特定的游戏需要这种控制水平

  2. 您不能内联定义它们,但您可以只进行前向声明。您需要在结构初始化中执行&func_name

  3. 没有; extern表示变量在另一个文件中声明,因此在该位置声明一个extern变量是没有意义的。此外,static表示只能从当前文件访问该变量,这与您想要的相反。将其设置为只读将需要getter函数,但是如果您只想让它可以从另一个文件访问,则通常在此处声明它(struct cardDefinitions[] = {...})而在另一个文件中使用extern(extern struct cardDefinitions[];)< / p>