2017-12-23 25 views
1

파이썬에서 C++로 복소수의 목록을 전달하여 벡터를 초기화하고 일부 작업 후에 복소수의 벡터를 다시 전달해야합니다. 파이썬. 여기 SWIG : C++에서 파이썬으로 복소수의 벡터를 전달하는 방법

내 시도입니다 :

본보기

%module example 

%{ 
#define SWIG_FILE_WITH_INIT 
#include "example.h" 
%} 

%include "std_vector.i" 
%include <complex.i> 
%include <std_complex.i> 
namespace std { 
    %template(DoubleVector) vector<double>; 
    %template(ComplexVector) vector<std::complex<double> >; 
} 
%include "example.h" 

example.cpp

#include "example.h" 


void my_class::set_value(Complex a, std::vector<Complex> v) 
{ 
    com1 = {1,2}; 
    comV = v; 
} 

void my_class::print_value() 
{ 
    std::cout << com1<< std::endl; 
    for (int i=0; i<comV.size(); i++) 
     std::cout<<comV[i]<<std::endl; 
} 

내가 컴파일하고 나에게 다음을 제공

#include <iostream> 
#include <cstdio> 
#include <vector> 
#include <omp.h> 
#include <complex> 

typedef std::complex<double> Complex; 

class my_class 
{ 
    private:  
     Complex com1; 
     std::vector<Complex> comV; 
    public: 
     my_class(){ } 
     void set_value(Complex a, std::vector<Complex> v); 
     void print_value(); 
}; 

example.h 테스트하려고하면 오류가 발생합니다. :

import example 
c = example.my_class() 
c.set_value(complex(1.0,3.5), [complex(1,1.2), complex(2.0,4.2)]) 
c.print_value() 

return _example.my_class_set_value(self, a, v) 
TypeError: in method 'my_class_set_value', argument 3 of type 'std::vector< Complex,std::allocator<Complex> >' 

어디에서 내가 실수 했습니까?

답변

1

ComplexVector의 명시적인 인스턴스화를 SWIG 파일에 넣어야합니다. 그렇지 않으면 작동하지 않습니다. 귀하의 실수는 std::complex<double> (네임 스페이스를 잊어 버렸습니다.)을 올바르게 수락하지 못했기 때문입니다.

%module example 

%{ 
#include "example.h" 
%} 

%include "std_vector.i" 
%include "std_complex.i" 
namespace std { 
    %template(DoubleVector) vector<double>; 
    %template(ComplexVector) vector<std::complex<double>>; 
} 
%include "example.h" 

Futhermore my_class::print_value()

는 잘못된 명령으로 이어질 것입니다 return 문이 없습니다.

+0

효과가있었습니다. @ Henri 감사합니다. – Abolfazl