2010-10-16 68 views
1

我写,如果我能做到这样的事情是可以简化一个C程序:如何根据char *指定函数指针的地址?

int (*func)(int); 
char* str= "adder"; 
func = str; 
func(2); 

我创建了一个函数指针,一个char *,我尝试分配功能的名称通过该char *的指针。在这个例子中,加法器(int)函数存在。

这实际上可行吗?

我知道做这纯粹是FUNC =加法器的标准方法;,但不会解决这个问题。

非常感谢!

Antonio

+1

有些事情让你接近,但你不能,比如说,有一个字符串和用它来定义按名称调用哪个函数。如果您告诉我们您真正想要做什么(核心问题),或许我们可以帮助您找到*正确*解决方案。 – 2010-10-16 22:19:49

+0

你好马克,我基本上试图根据传递给主函数的参数调用一个函数。我知道我可以用条件结构进行比较和检查,但我希望能以更有效的方式进行。感谢您的回答:) – abmirayo 2010-10-16 22:33:35

+0

感谢大家回答如此之快。我意识到这不是我能够轻松完成的任务,因为我提供的代码片段中,我将尝试使用R ..所示的映射技术。再次感谢你的帮助!! :) – abmirayo 2010-10-16 22:37:46

回答

3

你让一个表是这样的:

static const struct { 
    char *name; 
    int (*func)(int); 
} map[] = { 
    { "adder", adder }, 
    /* ... */ 
    { 0, 0 } 
} 

,然后使用此代码:

for (i=0; map[i].name && strcmp(map[i].name, str); i++); 
if (map[i].func) y = map[i].func(x); 
else /* ... */ 
+0

非常感谢您的回答,我认为这会让我朝着正确的方向发展 – abmirayo 2010-10-16 22:27:32

2

这不会做我认为你应该做的事。如果您设法将"adder"转换为函数指针,您将尝试将实际文本作为函数执行,而不是您想要的。你可以保留函数指针的数组,也可以保留文本→函数指针的映射。除此之外,我们需要更多关于你在做什么的信息。

+0

我其实是试图调用取决于传递给程序的参数的函数,没有与开关结构检查不同的可能性 – abmirayo 2010-10-16 22:31:49

2

我所知道的最好的办法是把你的函数在一个动态库,并使用dlsym或操作系统的等同于让你的函数指针。或者,您必须以某种方式从字符串到函数指针设置您自己的映射。

+0

谢谢您的回答,我会考虑你的答案设立地图 – abmirayo 2010-10-16 22:28:17

1

你可以在windows和getprocaddress函数中使用dll来完成类似这样的事情,但是你只需要使用具有相同签名的函数或者保留某种类型的精细映射。然而,你正在尝试做什么需要额外的基础设施。如果你使用C++,你可以使用地图来存储字符串和fnptrs之间的关系。

+0

谢谢,但我在纯C编程,在UNIX中 – abmirayo 2010-10-16 22:28:58