带void返回参数的SWIG、Python、C

带void返回参数的SWIG、Python、C,python,c,swig,void-pointers,Python,C,Swig,Void Pointers,我在C头文件中有以下函数构造函数: int my_fun(int i, void *a, void *b, void *c); 为了提供一些上下文,我提供了一个C代码实现,说明了如何使用它: int error; double *a, *b, *c; int i = 1; int num = 500; int num_dim = 2; a = (double *) calloc(num, sizeof(double)); b = (double *) calloc(num, sizeof(

我在C头文件中有以下函数构造函数:

int my_fun(int i, void *a, void *b, void *c);
为了提供一些上下文,我提供了一个C代码实现,说明了如何使用它:

int error;
double *a, *b, *c;

int i = 1;
int num = 500;
int num_dim = 2;

a = (double *) calloc(num, sizeof(double));
b = (double *) calloc(num, sizeof(double));
if (num_dim >= 3)
   c = (double *) calloc(num, sizeof(double));
else
   c = 0

 error = my_fun(i,a,b,c);
 error = my_fun(i,NULL,b,NULL); /*read only b*/
我想知道如何在SWIG接口文件中实现这一点。我使用了
typemaps.I
作为其他类型的指针返回参数,但它似乎不支持
void*

SWIG提供了一个与
calloc
非常匹配的文件。您可以使用宏
%array\u functions
%array\u class
公开一些将C样式数组包装到目标语言的帮助函数。(即使使用C,也可以同时使用这两种语言)。我使用
%include制作了以下界面,它一次包装并定义了一个简单的
myu-fun

%module test

%include "carrays.i"

%array_functions(double,DoubleArray)

%inline %{
  int my_fun(int i, void *a, void *b, void *c) {
    printf("my_fun: i=%d, a=%p, b=%p, c=%p\n",i,a,b,c);
    return 0;
  }
%}
如果您想支持更多类型,而不仅仅是
calloc(num,sizeof(double))
您需要向接口文件添加更多
%array\u函数。我还生成函数,用于获取和设置数组中的特定值,以及删除这些值

在此之后,您的示例用法在Python中变成如下所示:

import test

i = 5
num = 500
num_dim = 2

a = test.new_DoubleArray(num)
b = test.new_DoubleArray(num)
c = None
if num_dim >= 3:
  c =  test.new_DoubleArray(num)

error = test.my_fun(i,a,b,c)
error = test.my_fun(i,None,b,None)

# Beware of the exceptions, you need a finally: really
test.delete_DoubleArray(a)
test.delete_DoubleArray(b)
test.delete_DoubleArray(c)
我在我的系统上编译并运行了以下内容:

swig -python -Wall test.i gcc -fPIC -I/usr/include/python2.7 test_wrap.c -shared -o _test.so -Wall -Wextra LD_LIBRARY_PATH=. python2.7 run.py 注意,这里的引用计数消除了显式删除数组的需要,通过延迟引用计数解决了异常问题。
%array\u类
还提供了
\uuuu getitem\uuuuuuu
\uuuuuuu setitem\uuuuuuu
的实现,因此它可以像Python中的任何其他数组或容器一样进行子脚本编写。(不过没有边界检查,就像C一样)

SWIG提供了一个文件,它与
calloc
非常匹配。您可以使用宏
%array\u functions
%array\u class
公开一些将C样式数组包装到目标语言的帮助函数。(即使使用C,也可以同时使用这两种语言)。我使用
%include制作了以下界面,它一次包装并定义了一个简单的
myu-fun

%module test

%include "carrays.i"

%array_functions(double,DoubleArray)

%inline %{
  int my_fun(int i, void *a, void *b, void *c) {
    printf("my_fun: i=%d, a=%p, b=%p, c=%p\n",i,a,b,c);
    return 0;
  }
%}
如果您想支持更多类型,而不仅仅是
calloc(num,sizeof(double))
您需要向接口文件添加更多
%array\u函数。我还生成函数,用于获取和设置数组中的特定值,以及删除这些值

在此之后,您的示例用法在Python中变成如下所示:

import test

i = 5
num = 500
num_dim = 2

a = test.new_DoubleArray(num)
b = test.new_DoubleArray(num)
c = None
if num_dim >= 3:
  c =  test.new_DoubleArray(num)

error = test.my_fun(i,a,b,c)
error = test.my_fun(i,None,b,None)

# Beware of the exceptions, you need a finally: really
test.delete_DoubleArray(a)
test.delete_DoubleArray(b)
test.delete_DoubleArray(c)
我在我的系统上编译并运行了以下内容:

swig -python -Wall test.i gcc -fPIC -I/usr/include/python2.7 test_wrap.c -shared -o _test.so -Wall -Wextra LD_LIBRARY_PATH=. python2.7 run.py 注意,这里的引用计数消除了显式删除数组的需要,通过延迟引用计数解决了异常问题。
%array\u类
还提供了
\uuuu getitem\uuuuuuu
\uuuuuuu setitem\uuuuuuu
的实现,因此它可以像Python中的任何其他数组或容器一样进行子脚本编写。(不过没有边界检查,就像C一样)