免费注册 查看新帖 |

Chinaunix

广告
  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: snow888
打印 上一主题 下一主题

函数指针数组的动态赋值问题,求助。 [复制链接]

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
11 [报告]
发表于 2011-11-25 14:48 |只看该作者
回复 10# snow888

自己维护符号表,将字符串与函数地址对应起来。

你打算在C语言里做这种事吗?
  1. >>> def do_quries(): return ‘echo’
  2. >>> def echo():print 'hello,world'
  3. >>> eval(do_quries()+'()')
  4. hello,world
复制代码

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
12 [报告]
发表于 2011-11-25 14:55 |只看该作者
回复  snow888

自己维护符号表,将字符串与函数地址对应起来。

你打算在C语言里做这种事吗?
tempname2 发表于 2011-11-25 14:48



    好像也不是这个。



俺的意思是通过从数据库中取出一个字符串,根据这个字符串找到对应的这个函数的地址,然后把这个地址依次赋值给函数指针数组,从而生成一个权限列表,供不同的使用者调用。

如果按照6楼的方法,假设这个功能点有数千个,不得写数千个 else if 啊? 如果是那样,还不如用 switch 来得直接。

论坛徽章:
0
13 [报告]
发表于 2011-11-25 14:59 |只看该作者
本帖最后由 fallening 于 2011-11-25 15:04 编辑

回复 1# snow888


    碰到过这个问题,我在 C++ 中这样处理的:
  1. typedef std::map<std::string, std::function<void(void)> > id_fun_table_type;
复制代码
然后直接查询就好:
  1. std::function<void(void)> query( const std::string& id, const id_fun_table_type& id_fun_table )
  2. {
  3.    return id_fun_table[id];
  4. }
复制代码
Edit: 上边是 C++0x 引入了 std::function 之后的处理方式。
在 C++0x 之前,我用的是工厂模式处理这个问题,也就是创建一个物件工厂,然后客户传入一个 string ,得到一个物件指针。有关工厂模式网上很多资料,不多说了。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
14 [报告]
发表于 2011-11-25 15:05 |只看该作者
回复  snow888


    碰到过这个问题,我在 C++ 中这样处理的:然后直接查询就好:
fallening 发表于 2011-11-25 14:59



    俺现在能想到的也就是这个办法,通过再定义一个函数指针数组,然后通过获取下标的方式返回这个函数指针数组的具体值,再对 FunList 数组进行赋值。

不知道游牧有更好的,更直接的办法?

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
15 [报告]
发表于 2011-11-25 15:10 |只看该作者
不知道游牧有更好的,更直接的办法?
snow888 发表于 2011-11-25 15:05



    把你要用的函数做成一个动态库,然后用 dlopen 加载,用 dlsym 查询符号对应的地址。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
16 [报告]
发表于 2011-11-25 15:12 |只看该作者
把你要用的函数做成一个动态库,然后用 dlopen 加载,用 dlsym 查询符号对应的地址。
MMMIX 发表于 2011-11-25 15:10



    晕,老大,不知道是你理解错了,还是俺理解错了啊 。。。

论坛徽章:
0
17 [报告]
发表于 2011-11-25 15:23 |只看该作者
俺现在能想到的也就是这个办法,通过再定义一个函数指针数组,然后通过获取下标的方式返回这个函 ...
snow888 发表于 2011-11-25 15:05

指针数组的问题是 1) 动态增长困难 2) 查询效率低下 O(n)

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
18 [报告]
发表于 2011-11-25 15:36 |只看该作者
回复 12# snow888

晕,6楼只是一种实现方式,你可以专门做一个接口去实现。

int add_to_func_list(char *name, void *addr)
void * get_func(char *name)

至于内部怎么实现(list,hash,etc.)就看情况了。

如果不想让add_to_func_list有运行时开销,可以改用宏,类似内核里EXPORT_SYMBOL或者uboot里添加command的实现。大概的步骤是:
struct {
    char * name;
    void * addr;
} entry;

#define ADD_TO_FUNC_LIST(func) \
       struct entry func_##entry  __atrribute__((section("func_list"))) = {#func, func};

然后为func_list这个section生成起始符号,get_func就相当于遍历struct entry数组,挨个比较name就可以了。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
19 [报告]
发表于 2011-11-25 15:36 |只看该作者
指针数组的问题是 1) 动态增长困难 2) 查询效率低下 O(n)
fallening 发表于 2011-11-25 15:23



    所以俺才问有木有更直接的办法撒。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
20 [报告]
发表于 2011-11-25 15:39 |只看该作者
回复  snow888

晕,6楼只是一种实现方式,你可以专门做一个接口去实现。

int add_to_func_list(char ...
tempname2 发表于 2011-11-25 15:36



    那和俺通过数组下标返回函数地址,有啥子区别?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP