将SWIG与指向C结构的指针一起使用

发布于 2021-01-29 15:05:37

我正在尝试为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
被浏览
129
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    我找到了答案。如果我将函数指针声明为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的自定义代码(我希望仅在不进行任何修改的情况下仅“%include”我的标头)进行编写,但是我想这可以做到。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看