我在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中的lambda函数)?
< / LI>我需要从另一个文件对cardDefinitions进行只读访问 - 对于那个'extern static'是否正确?
我知道这是很多问题,但我真的有点模糊不清。
感谢。
编辑:
要明确,我的目标是能够做类似
的事情int cost = cardDefinitions[cardNumber].cost;
或
int result = cardDefinitions[cardNumber].do_action(state, choice1, choice2);
而不是在所有地方使用巨大的开关语句。
答案 0 :(得分:37)
你的方法是完全正确的。
switch
语句的好方法。 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)
这应该可以正常工作。看起来你有很多功能,如果你每张卡一个,但也许这个特定的游戏需要这种控制水平
您不能内联定义它们,但您可以只进行前向声明。您需要在结构初始化中执行&func_name
没有; extern
表示变量在另一个文件中声明,因此在该位置声明一个extern变量是没有意义的。此外,static
表示只能从当前文件访问该变量,这与您想要的相反。将其设置为只读将需要getter函数,但是如果您只想让它可以从另一个文件访问,则通常在此处声明它(struct cardDefinitions[] = {...}
)而在另一个文件中使用extern(extern struct cardDefinitions[];
)< / p>