2013-10-23 32 views
0

我有一个程序在C函数有点像下面的代码。当我尝试通过python调用此函数时,它抛出错误,说在SWIG中,我怎样才能使用int *变量没有typemaps.i

类型为'int *'的参数2。在swig中,我看到有办法通过typemaps来处理这种情况,还有其他类型地图的其他方式。由于有大量的函数具有众多的参数int *。

#include<stdio.h> 

int check(int k, int *i) { 
    if(k%2 == 0) 
    *i = 1; 
    else 
    *i = 0; 
} 

回答

1

Typemaps真的痛饮处理所有类型的方式,但如果你不想typemaps.i具体来说,然后做怎么样:

%module x 

%include <cpointer.i> 
%pointer_functions(int,int) 

%inline %{ 

void check(int k, int *i) { 
    if (k % 2 == 0) 
    *i = 1; 
    else 
    *i = 0; 
} 

%} 

cpointer.i,您可以创建简单的指针的类型。以下是一个使用示例:

>>> import x 
>>> i=x.new_int() 
>>> x.check(6,i) 
>>> x.int_value(i) 
1 
>>> x.delete_int(i) 

但实际上,使用typemaps.i会更简单。低于%apply将应用预定义的OUTPUT typemap,声明所有将来的int *参数都是输出参数。 Python不需要调用参数,而是将参数作为输出返回。正常的返回值和所有输出参数在必要时使用元组返回。

%module x 

%include <typemaps.i> 
%apply int *OUTPUT { int * }; 

%inline %{ 

void check(int k, int *i) { 
    if (k % 2 == 0) 
    *i = 1; 
    else 
    *i = 0; 
} 

%} 

使用例如:

>>> import x 
>>> x.check(5) 
0 
>>> x.check(6) 
1 
+0

嗨,马克, 根据你的建议我使用typemaps。但即使在类型映射我无法实现以下场景...... int f_name(int * k) 在C中,在该函数中正常填充并将返回一些值......但在这里甚至使用类型映射我无法做到这一点,它将填充值作为列表返回(例如:[,]),而不是填充值k。 –

+0

Python不能修改整数,因为它是不可变的。这就是为什么它将输出参数作为元组返回。称之为:'ret,k = f_name(k)'。 –