在SWIG中,如何在没有typemaps.i的情况下使用int *变量

时间:2013-10-23 11:59:51

标签: python c swig

我有一个程序,在C函数中有点像下面的代码。当我尝试通过python调用此函数时,它抛出错误说

类型为'int *'的参数2。在swig中我看到有办法处理这个通过类型映射是否有其他方式的其他类型图。因为有许多函数有许多带有int *的参数。

#include<stdio.h>

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

1 个答案:

答案 0 :(得分:1)

字体映射实际上是SWIG处理所有类型的方式,但如果您不想具体使用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类型映射,声明所有未来的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