动态调用函数问题

wuti_pl 2011-03-07 09:58:29
我要设计一个程序,在程序中有一个被调用函数集合。用户可以根据自己的需要去选择对应的函数,将其函数名添加在执行列表里,同时输入函数所需的参数。
我考虑的方法是给每个函数定义一个对应编号,在用户选择函数时把该编号添加到一个执行链表里,同时给函数赋参数,保存在参数列表里。然后当用户执行这些函数时,通过查找执行链表里的编号,再进行开关语句的判断来调用函数。个人感觉这个方法很笨,可是又不知道怎么作才好,而且处理参数时也比较麻烦。请各位给予指导。谢谢。
...全文
289 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
pathuang68 2011-03-07
  • 打赏
  • 举报
回复
函数指针的几种用法有你想要的答案和代码。
微笑的鱼 2011-03-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wuti_pl 的回复:]
我想了一个思路就是参考VC++里的消息映射机制。但实现起来比较麻烦。谁能一起讨论一下?
[/Quote]

我做过类似的,并不麻烦,用std::map,用消息做键值,数据为函数指针就可以了。
赵4老师 2011-03-07
  • 打赏
  • 举报
回复
COM
xianguang321 2011-03-07
  • 打赏
  • 举报
回复
1、关于函数:由于放到动态库中的函数一般是不会重名的,建议放到一个map中,按照函数名字,函数地址配对存放,调用的时候只需要匹配函数名,然后取函数地址直接执行即可。
2、关于参数:参数可以模板化,这样就可以通用一些。不过得预先在动态库的函数中都应用起来。
至于如何加载动态库及存放到map中以及如何使用参数模板化我就不用说了吧?
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wuti_pl 的回复:]

但问题还是出自参数个数不固定上。
[/Quote]

你要模拟一次汇编调用压栈的做法
辰岡墨竹 2011-03-07
  • 打赏
  • 举报
回复
程序嵌入简单脚本用不着自己写,直接用Lua,可以利用C接口自定义解释过程
wuti_pl 2011-03-07
  • 打赏
  • 举报
回复
6楼老师的想法不错,但是对于函数参数个数不固定的如何处理呢?而且这种方法和我说的编号方法对于提高效率上起的作用好像都不大。1楼4楼说得用函数指针数组倒是一个不错的主意,但问题还是出自参数个数不固定上。
  • 打赏
  • 举报
回复
我曾经做过,但是很不通用,本来是想改善现有产品的,后来感觉也没多大的实用价值,就做了个半调子扔了
我当初的想法就只针对某一种调用方式,反正所有的函数都有个地址,所有的功能模块在加载的时候通过接口向系统提交它的函数名称、函数地址、函数序号和参数类型,保存在链表中
用户通过写脚本的方式调用其功能,根据名称找到功能模块,到链表里面比较一下参数类型是否匹配,匹配的就把函数序号存下来,执行的时候根据序号把地址取出来,再把参数压栈执行
ouyh12345 2011-03-07
  • 打赏
  • 举报
回复
同时输入函数所需的参数

可以用SetParameter(char *name, char *value)的方式输入参数
碎碎念 2011-03-07
  • 打赏
  • 举报
回复
用函数指针数组来做...
wuti_pl 2011-03-07
  • 打赏
  • 举报
回复
我想了一个思路就是参考VC++里的消息映射机制。但实现起来比较麻烦。谁能一起讨论一下?
wuti_pl 2011-03-07
  • 打赏
  • 举报
回复
可以说得具体点吗?
bdmh 2011-03-07
  • 打赏
  • 举报
回复
可用函数指针数组来做
wuti_pl 2011-03-07
  • 打赏
  • 举报
回复
谢谢大家给予指导。我决定结贴了。通过大家的提示发现没有什么好的方法去解决我想实现的功能。可能是我没说清楚,我的函数调用是动态的,不知道什么时候调用哪一个,所以在程序里无法用代码指定,开始我设想用一个函数对应一个标号,标号存储在list里。然后按顺序提出编号,查找对应的函数进行执行。利用开关语句。看样子这个方法是最可行的,包括参数也能处理。大家的方法真的不太有用。分数照给。还是学了很多方法。谢谢大家。
super_admi 2011-03-07
  • 打赏
  • 举报
回复
由上,当你需要增加一个功能函数的时候,则需要进行函数注册,以建立编号和函数入口的对应关系。

ACAD的ARX,NX的OPEN API,从表面上看,都是这么做的,内部如何实现,我就不知道了。
super_admi 2011-03-07
  • 打赏
  • 举报
回复
COM当然是个好办法,但那玩意,我觉得实在是难掌握,实现起来麻烦事情也多。

我的建议是,维护一个函数入口地址与自动编号的映射表。每次增加一个函数调用时,需要增加一个映射。

当需要调用函数时,先找到编号,再通过编号找到地址。
wuti_pl 2011-03-07
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 huangjunyf2 的回复:]
引用 3 楼 wuti_pl 的回复:
我想了一个思路就是参考VC++里的消息映射机制。但实现起来比较麻烦。谁能一起讨论一下?


我做过类似的,并不麻烦,用std::map,用消息做键值,数据为函数指针就可以了。
[/Quote]

能否给个例子,我的邮箱wuti_pl@163.com

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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