我正在尝试为C库编写一个SWIG包装器,该库使用指向其结构中函数的指针。我无法弄清楚如何处理包含函数指针的结构。下面是一个简化的例子。
test.i:
/* test.i */
%module test
%{
typedef struct {
int (*my_func)(int);
} test_struct;
int add1(int n) { return n+1; }
test_struct *init_test()
{
test_struct *t = (test_struct*) malloc(sizeof(test_struct));
t->my_func = add1;
}
%}
typedef struct {
int (*my_func)(int);
} test_struct;
extern test_struct *init_test();
示例会话:
Python 2.6.2 (release26-maint, Apr 19 2009, 01:56:41)
[GCC 4.3.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import test
>>> t = test.init_test()
>>> t
<test.test_struct; proxy of <Swig Object of type 'test_struct *' at 0xa1cafd0> >
>>> t.my_func
<Swig Object of type 'int (*)(int)' at 0xb8009810>
>>> t.my_func(1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'PySwigObject' object is not callable
有人知道是否可以让 t.my_func(1)返回2?
谢谢!
答案 0 :(得分:1)
我找到了答案。如果我将函数指针声明为SWIG“成员函数”,它似乎按预期工作:
%module test
%{
typedef struct {
int (*my_func)(int);
} test_struct;
int add1(int n) { return n+1; }
test_struct *init_test()
{
test_struct *t = (test_struct*) malloc(sizeof(test_struct));
t->my_func = add1;
return t;
}
%}
typedef struct {
int my_func(int);
} test_struct;
extern test_struct *init_test();
会话:
$ python
Python 2.6.2 (release26-maint, Apr 19 2009, 01:56:41)
[GCC 4.3.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import test
>>> t = test.init_test()
>>> t.my_func(1)
2
我希望能找到一些不需要编写任何自定义SWIG特定代码的东西(我更喜欢在没有修改的情况下“包含”我的标题),但我猜这个。
答案 1 :(得分:0)
你忘记了“回归”;在init_test()中:
#include <stdlib.h>
#include <stdio.h>
typedef struct {
int (*my_func)(int);
} test_struct;
int add1(int n) { return n+1; }
test_struct *init_test(){
test_struct *t = (test_struct*) malloc(sizeof(test_struct));
t->my_func = add1;
return t;
}
int main(){
test_struct *s=init_test();
printf( "%i\n", s->my_func(1) );
}