2017-11-02 6 views
0

Ich schreibe eine C++ Bibliothek und ich würde gerne in der Lage sein, es in Python zu nennen. Ich würde gerne Swig verwenden Ich bin erfolgreich in der Lage, das Python-Modul zu erstellen und zu kompilieren, aber ich habe ein wenig zu kämpfen, um zu verstehen, wie Schnittstelle Python und C++.Swig - C++ Vektor einer Struktur und wie man sie verbindet

struct twod { 
     double x; ///< x value 
     double y; ///< y value 
    }; 

    double distance_calculation(std::vector <twod> A, std::vector <twod> B); 

Dies ist ein Snap meiner Header-Datei. Nach meiner .i-Datei:

%module hausdorff 
%{ 
#include "Hausdorff.h" 
using namespace hausdorff; 
%} 


%include "std_vector.i" 
%include "Hausdorff.h" 
namespace std { 
    %template(vector2d) vector<twod>; 
} 

In Python Ich bin in der Lage, das Objekt zu erstellen:

In [13]: vector = hausdorff.vector2d 

In [14]: vector = ([1,2], [3,4]) 

In [15]: result = hausdorff.distance_calculation(vector, vector) 

Und ich als Fehler:

TypeError: in method 'distance_calculation', argument 1 of type 'std::vector< hausdorff::twod,std::allocator<hausdorff::twod> >' 

Wie finde ich das richtige Objekt übergeben zur Funktion?

Antwort

0

Es ist ein wenig komplizierter als das, zumindest ohne weitere Arbeit:

>>> import hausdorff 
>>> v = hausdorff.vector2d() 
>>> a = hausdorff.twod() 
>>> a.x = 1.2 
>>> a.y = 2.3 
>>> v.push_back(a) 
>>> a.x = 3.4 
>>> a.y = 4.5 
>>> v.push_back(a) 
>>> test.distance_calculation(v,v) 

Wenn Sie Konstrukteuren für Ihre Struktur bereitzustellen, können Sie vereinfachen:

>>> test.distance_calculation([test.twod(1.2,3.4),test.twod(1.2,3.4)], 
           [test.twod(4.5,6.7),test.twod(1.2,3.4)]) 

Wenn Sie typemap Umwandlungen liefern, was ich als Übung lasse (oder eine andere SO Frage: ^) kann das machen:

>>> test.distance_calculation([(1.1,2.2),(3.3,4.4)],[(5.5,6.6),(7.7,8.8)])