2013-03-03 11 views
8

Aşağıdaki örnekte iki bağımsız değişkenin verildiği bir C++ işlevim var.Python + SWIG'de nasıl referans ve işaretçi argümanları alınır?

void func(int& n, char** data) 
{ 
    *data = other_func1(); // returns a char array 
    n = other_func2(); // returns the length of the array 
} 

Kolayca C veya C++ bu işlevi kullanabilirsiniz, ancak ben yudum ile oluşturulan bir Python modülünden diyebilirsiniz bilmiyorum. Sanırım, örneğin std :: çifti döndüren başka bir C++ işlevi yazmam gerekecek. Fakat mümkünse Python tarafında bir çözüm bulmak istiyorum. Biri yardım edebilir mi? Yudum çıkış parametreleri sağlayan bazı varsayılan typemaps kullanır

%apply int *OUTPUT { int *n }; 

: yazmak için yeterli olacaktır durumlarda (örneğin int *n) oldukça çok için

cevap

8

. (Ayrıca benzer olan INOUT ve INPUT vardır).

Bu örnekte, önceden tanımlanmış durumlardan hiçbiriyle tam olarak eşleşmiyor olsak da, aynı şeyi el ile yapmamız gerekiyor. Bu temelde argüman başına iki tip haritasıdır - gerçek fonksiyon çağrısı için geçici bir şey yaratan ve bazı gerçek girdiler yerine ve sonucu geçici olarak Python'dan geri döndüren bir argout yerine kullanan bir giriş tip haritası. Python durumunda, çoklu argümanları döndürmek için bir tuple kullanmak mantıklıdır.

Bir örnek:

%module test 

%typemap(in,numinputs=0) int& n (int temp) "$1 = &temp;" 
%typemap(in,numinputs=0) char **data (char *temp) "$1 = &temp;" 

%typemap(argout) char **data { 
    %append_output(PyString_FromString(*$1)); 
} 

%typemap(argout) int& n { 
    %append_output(PyInt_FromLong(*$1)); 
} 

%inline %{ 
    void foo(int& n, char **data) { 
    static char str[] = "Hello world"; 
    *data = str; 
    n = sizeof str; 
    } 
%} 

Dikkat edilmesi gereken noktaları:

geçici değişkenler belirgin adı çatışması durur otomatik değiştirildi olsun (int temp, char *temp). %append_output, Python'da $result kopyasının arkasına bir şey eklemek için genişleyen bir SWIG makrosu. Eğer işleviniz foo dinamik olarak ayrılmış bellekse, bununla ilgilenmeniz gerekir. Tipik olarak, bellekte dinamik olarak yer alması gerekiyorsa, freearg typemap genellikle yararlıdır.

import test 

len,str = test.foo() 

print len 
print str 
:

Bu

beni derlemek için izin ve gibi çalıştırmak için yeterli oldu
İlgili konular