【发布时间】:2013-11-15 23:47:54
【问题描述】:
我想将一些函数保存到哈希表中,键是整数(一些 id),值是函数(或地址?)。我的问题是,如何将它们存储在哈希表中,以便我可以按键获取函数? 哈希表插入函数是这样的:
int ht_insert(ht_table *ht, void *key, size_t key_len, void *value, size_t value_len)
int func(void *){...}
我的代码是:
ht_insert(ht_tab, &myid, sizeof(myid), &func, sizeof(func));
而且效果不好。
-----------------------下面有更多详细信息----------------
1.哈希表可以设置为COPY或REFERENCE模式,我选择COPY模式(key和value)。 2.实际上我使用函数指针作为参数,我的原始帖子可能会混淆某些人。所以我在这里多放了一些代码:
typedef int (*request_callback)(void *request); //typedef a function pointer
int add_callback_by_id(int id, request_callback cb)
{
...
ht_insert(ht_tab, &id, sizeof(id), cb, sizeof(request_callback));
...
}
//here, pointer of func is passed to add_callback_by_id
add_callback_by_id(request_id, &func);
//
if ((cb = ht_lookup(ht_tab, &id, sizeof(id))) != null)
{
....
(*(request_callback)cb)(request); //crashed here!
....
}
最后,我使用 user694733 的解决方案,通过定义一个包装结构。有效!
typedef struct _callback_obj
{
request_callback cb;
}callback_obj;
int add_callback_by_id(int id, request_callback cb)
{
callback_obj cb_obj;
...
cb_obj.cb = cb;
ht_insert(ht_tab, &id, sizeof(id), &cb_obj, sizeof(callback_obj));
...
}
//
if ((pcb_obj = ht_lookup(ht_tab, &id, sizeof(id))) != null)
{
....
(*(request_callback)pcb->cb)(request); //works, ^-^!
....
}
虽然有效,但不方便。
【问题讨论】:
-
it doesn't work well.是什么意思? -
@abasu 他的意思是根本
-
您遇到了什么样的错误?编译器说你做了非法的事情是编译错误吗?它是一个运行时错误,它编译得很好,但没有做你想做的事?
-
我可以通过key获取value(一些东西,可能不是函数地址),但是(*value)(...) crash @abasu
-
崩溃了,不是编译问题。@jingtao