2013-11-21 13 views
5

Çiftlerin bir vektörüne bir sabit referans döndüren bir C++ yöntemi sarmaya çalışırken çok fazla sorun yaşıyorum. %typemap(out) kullanarak tuples.İade vektörü <pair <int,int>> & C++ yönteminden swig tipemap kullanarak tupl'lerin python listesine

MyClass.h:

#inlcude <vector> 
using std::vector; 
class MyClass { 
private: 
    const vector<pair<int,int>> & _myvector; 
public: 
    MyClass(const vector<pair<int,int>> & myvector); 
    const vector<pair<int,int>> & GetMyVector() const; 
} 

MyClass.cpp:

#include "myclass.h" 

MyClass::MyClass(const vector<pair<int,int>> & myvector): _myvector(myvector){}; 

const vector<pair<int,int>> & MyClass::GetMyVector() const { 
    return _myvector; 
}; 

benimSinif.i: (ommited Kontrolden)

%module MyClass 
%include "std_vector.i" 

namespace std { 
    %template(vector_pair_int) vector<pair<int,int>>; 
} 

%typemap(in) (const vector_pair_int &){ 

    $1 = new vector<pair<int,int>>; 
    int size = PyList_Size($input); 
    for (int i=0; i<size; i++){ 
     PyObject *o = PyList_GetItem($input,i); 
     PyObject *o1 = PyList_GetItem(o,0); 
     PyObject *o2 = PyList_GetItem(o,1); 
     $1->push_back(make_pair(PyInt_AsLong(o1),PyInt_AsLong(o2))) 
} 

} 

%typemap(out) (const vector_pair_int &) { 
    $result = PyList_New($1.size()); 
    vector<pair<int,int>>:: const_iterator it; 
    int count=0; 
    for (it= $1.begin(); it!= $1.end(); ++it){ 
     PyObject * tup = PyTuple_Pack(2, it->first,it->second); 
     PyList_SET_ITEM($result,count,tup); 
     count++; 
    } 
} 

Şu anda böyle bir şey var

Tamam, ilk t Tamamen anlayamadığım hing, bir önceki örnek kodun (out) derlenmemesidir çünkü 1 $ 'ın konteynere bir referans değil, bir gösterici olduğunu söyler. Bir işaretçi olarak $ 1 kullanımını değiştirdiğimde, derler ama işe yaramıyor.

İkincisi, derleme durumunda (typ) (in) çalışır (C++ kapsayıcı doğru şekilde doldurulur), ancak kapsayıcıyı python'dan almaya çalıştığımda çöp alıyorum. Yapımcıya MyClass ([(1,2)] gibi bir şeyden geçtiğimde ve sonra GetMyVector() kullanırım, bir python listesi döndürür, ancak 3 boyutlu ve tupllerde çöp ile ... yanlış yapıyorum ???

cevap

7

Bu örnek için özel bir tip haritası gerekli değildir. Yudum vektörü ve çift şablonları için yerleşik destek, ancak çifti yanı sıra şablon vektör şablonu beyan etmek zorunda etti:

%module x 

%include <std_pair.i> 
%include <std_vector.i> 
%include <std_string.i> 
%template() std::pair<int,int>; 
%template(PairVector) std::vector<std::pair<int,int> >; 

%{ 
#include "MyClass.h" 
%} 

%include "MyClass.h" 

Örnek:

>>> import x 
>>> a=x.PairVector(((1,2),(3,4),(5,6))) 
>>> b=x.MyClass(a) 
>>> b.GetMyVector() 
((1, 2), (3, 4), (5, 6)) 

Ama sınıf yazıldığı notu çünkü Gönderilen vektöre bir başvuruda bulunmak ve bir kopya almak için, MyClass'ın ömrü boyunca ona bir başvuru yapmanız gerekir. Örneğin:

>>> del a 
>>> b.GetMyVector() 
*Undefined Behavior (crash, empty vector, etc.)* 
İlgili konular