3

構造体で関数へのポインタを使用する 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 に戻すことが可能かどうかは誰にもわかりませんか?

ありがとう!

4

2 に答える 2

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 固有のコードを記述する必要がないものを望んでいました (変更せずにヘッダーを "%include" することをお勧めします) が、これでうまくいくと思います。

于 2009-10-19T00:31:42.143 に答える
0

「return t;」を忘れています。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) );
}
于 2009-10-17T22:05:01.033 に答える