2017-11-02 19 views
0

저는 C++ 라이브러리를 작성 중이며 파이썬으로 호출 할 수 있기를 바랍니다. 나는 swim 모듈을 성공적으로 생성하고 컴파일 할 수 있지만, Python과 C++ 인터페이스를 이해하는 방법에 대해서는 조금 고심하고있다.구조체의 Swig - C++ 벡터와 그것들을 인터페이스하는 방법

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

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

이것은 내 헤더 파일의 스냅입니다. 내 .I 파일 다음은

파이썬에서
%module hausdorff 
%{ 
#include "Hausdorff.h" 
using namespace hausdorff; 
%} 


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

내가 개체 만들 수 있어요 :

In [13]: vector = hausdorff.vector2d 

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

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

을 내가 오류로 얻을 : 내가 올바른 개체를 전달할 수있는 방법

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

함수에?

답변

0

그것은 적어도 더 많은 작업을하지 않고, 그보다 조금 더 복잡 : 당신이 당신의 구조 생성자를 제공하는 경우

>>> 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) 

, 당신은 간단하게 할 수 있습니다

>>> 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)]) 

는 타입 맵 전환을 제공하는 경우, 나는 운동으로 남겨 둡니다. (또는 또 다른 질문입니다. ^)이 작업을 수행 할 수 있습니다 :

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