2013-10-23 33 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)'。 –