如何根据输入的名字来动态决定调用的函数?

Key 2008-03-29 02:10:39
目前我有很多C语言统一格式的函数,参数完全相同,类似一个函数库.

比如, 函数都类似于:

int ABC001(int length, char* indata, char* outdata, int ret) {
...
}

int ABC002(int length, char* indata, char* outdata, int ret) {
...
}
我目前已经将这些函数,每个函数一个文件,文件名就是函数名, 然后都进行了编译.

我希望,在我的主函数里面, 通过用户输入不同的值,来调用不同的函数对数据进行处理. 但是, 函数的具体名字无法确定.只能等到执行的时候,才能确定. 请问, 如何实现对这些函数的调用? 当然,编译的时候,由于还不确定有多少函数,所以,不需要连接这些函数. 请问, 如何实现啊?

我知道, 用 COBOL 可以在代码写 USING XXX XXX 的形式来实现这种, 可是,目前我打算 将以前的COBOL程序改为C程序,不知道是否可以实现.
...全文
287 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
Key 2008-04-08
  • 打赏
  • 举报
回复
我怎么这么命苦, 遇到这么倒霉的用户。。。


伤心,结贴
lin_style 2008-04-08
  • 打赏
  • 举报
回复
LZ可以看看MFC里面一些函数映射的实现
taodm 2008-04-08
  • 打赏
  • 举报
回复
算了,楼主啊,你还是内嵌Lua或者python吧。
这样你就可以使用类似COBOL的特性了。
Treazy 2008-04-08
  • 打赏
  • 举报
回复
动态调用是一种

其实还有其他方法,如果你能绝对定位到函数入口,那显然你的问题就变成了去搜索一个map,然后去执行这个函数

当然这里的map需要人为去更新

在一定的特定编译器下会产生这样一个map表,那就相对简单了,因为直接可通过它去定位
Supper_Jerry 2008-04-08
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 lyqq 的回复:]
引用 11 楼 coding_hello 的回复:
这里有几个问题要清楚,才能够解决你的问题:

1.由于需要动态增加函数模块,所以主程序显然无法一开始就加入所有模块。于是就有个问题,它何时知道有新模块可以用了?方法很多,依赖于lz现在的程序设计。


通过动态库的动态加载应该是可以实现的。

其实,我就是在等“通过动态库的动态加载应该是可以实现的。”这句话而已。

只是可惜,csdn上,除了特牛的人(什么都会)…
[/Quote]
哈哈哈哈..........
liuzewei 2008-04-08
  • 打赏
  • 举报
回复
动态追加,只能用DLL!!
Key 2008-04-08
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 coding_hello 的回复:]
这里有几个问题要清楚,才能够解决你的问题:

1.由于需要动态增加函数模块,所以主程序显然无法一开始就加入所有模块。于是就有个问题,它何时知道有新模块可以用了?方法很多,依赖于lz现在的程序设计。


通过动态库的动态加载应该是可以实现的。
[/Quote]
其实,我就是在等“通过动态库的动态加载应该是可以实现的。”这句话而已。

只是可惜,csdn上,除了特牛的人(什么都会)就是特X的人(什么都敢胡说)。

太牛的人,一般说问题都是点到为止。
太X的人,就不好评论什么啦。

谢谢以上人等。
yuwei2589 2008-03-29
  • 打赏
  • 举报
回复
lz,如果函数名称都象你提供的这样规则,还有个方法可以试下:

定义宏似乎可以更方便些:

#define FUNC(a) ABC00##a

在程序中就可以直接调用了:

#include <iostream>
int main()
{
int num;
std::cin>>num;
FUNC(num)(int length, char* indata, char* outdata, int ret) ;
return 0;
}


[Quote=引用楼主 lyqq 的帖子:]
目前我有很多C语言统一格式的函数,参数完全相同,类似一个函数库.

比如, 函数都类似于:

int ABC001(int length, char* indata, char* outdata, int ret) {
...
}

int ABC002(int length, char* indata, char* outdata, int ret) {
...
}
我目前已经将这些函数,每个函数一个文件,文件名就是函数名, 然后都进行了编译.

[/Quote]
野男孩 2008-03-29
  • 打赏
  • 举报
回复
这里有几个问题要清楚,才能够解决你的问题:

1.由于需要动态增加函数模块,所以主程序显然无法一开始就加入所有模块。于是就有个问题,它何时知道有新模块可以用了?方法很多,依赖于lz现在的程序设计。

2.主程序根据什么条件来调用一个它可能还不知道的函数?一定会有一种机制来触发主程序,使它知道目前的函数都不行,要新模块里的函数才可以。

实际上,这两个问题可能是同一个问题,弄清楚触发机制,也就一切清楚了。通过动态库的动态加载应该是可以实现的。
iceheart 2008-03-29
  • 打赏
  • 举报
回复

void addHandler(const char *name, _FUNCTION fn);
typedef void (*ADD_PROC)(const char *name, _FUNCTION fn);
typedef void (*LOAD_PROC)(ADD_PROC);
void loop_proc(...)
{
...
HMODULE hLib = loadlibrary("xxx");
LOAD_PROC proc = getProcAddress(hLib);
if ( proc ) proc(addHandler);
...
}
//以上为主模块

//以下为动态加载模块中固定函数名
void load(ADD_PROC proc)
{
proc("aaa", aaa);
proc("bbb", bbb);
....
}
Key 2008-03-29
  • 打赏
  • 举报
回复
楼上的代码, 我在任何时候都不能按照这种方式用, 因为,我无法知道所有的函数名.

我的主文件 是在线系统, 不能停止,

在运行以后需要动态的追加 模块, 也就是 直接加入 新建的 编译后的函数文件, 然后, 用户就可以使用 新加入的函数啦.而不停止主文件的运行.

而且, 追加的模块可能 主文件无法得知名称, 只能等到运行的时候才能 得到. 所以, 代码里面绝对不能硬编码.

iceheart 2008-03-29
  • 打赏
  • 举报
回复
m_handler["aaa"] = aaa;
m_handler["bbb"] = bbb;
m_handler["ccc"] = ccc;
m_handler["ddd"] = ddd;

是不是硬编码要看你这几行代码在什么时候用了
Key 2008-03-29
  • 打赏
  • 举报
回复
另: 感谢, 深夜回帖.
Key 2008-03-29
  • 打赏
  • 举报
回复
楼上的ms可以...

不过, 仔细研读以后,发现, 还是硬编码.
iceheart 2008-03-29
  • 打赏
  • 举报
回复
typedef int (*_FUNCTION)(int length, char* indata, char* outdata, int ret);
#include <map>
#include <string>
using namespace std;
typedef map<string, _FUNCTION> _HANDLER_MAP;

...
_HANDLER_MAP m_handler;

int aaa(int length, char* indata, char* outdata, int ret);
int bbb(int length, char* indata, char* outdata, int ret);
int ccc(int length, char* indata, char* outdata, int ret);
int ddd(int length, char* indata, char* outdata, int ret);

...
m_handler["aaa"] = aaa;
m_handler["bbb"] = bbb;
m_handler["ccc"] = ccc;
m_handler["ddd"] = ddd;

...

void main_proc(..)
{
string variant;
...
_HANDLER_MAP::iterator it = m_handler.find(variant);
if ( it != m_handler.end() ) it->second(...);
...
}
Key 2008-03-29
  • 打赏
  • 举报
回复
以上各位,谢谢..


不过, 我所有的函数都在各自不同的文件里面. 并且,都独自进行编译.

而且, 在编译主函数以后 , 这些函数文件还可能动态的追加. 以上各位的方法,可能就无法实现啦.
HelloDan 2008-03-29
  • 打赏
  • 举报
回复
其实这样的实现也不难。相当于一个switch case语句或者使用地址表来实现。至于输入的如果是一个函数名,不是数字也可以建立这样的映射,如用C++的 map。下面的一个例子给你参考一下吧。


#include<stdio.h>

/* Address table*/
double add(double a,double b)
{
return a+b;
}

double sub(double a,double b)
{
return a-b;
}

double mul(double a,double b)
{
return a*b;
}



int main()
{

double result;
int oper;
double a,b;
double (*op_fun[])(double, double )={add,sub,mul};
scanf("%d,%lf,%lf",&oper,&a,&b);
result=op_fun[oper](a,b);
printf("%lf",result);


return 0;
}

abupie 2008-03-29
  • 打赏
  • 举报
回复
把函数指针放到一个数组或者表,和你的文件对应起来就好了。
运行的时候 文件 =》 函数指针 =》 调用函数。

abupie 2008-03-29
  • 打赏
  • 举报
回复
传函数指针。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧