2016-06-24 2 views
1

J'ai une fonction en C++ qui retourne une liste de complexe:SWIG: Comment passer la liste des complexes de C++ à python

#include <complex> 
std::list< std::complex<double> > func(...); 

Que dois-je faire dans le « * » .i fichier?

Merci tout le monde.

=================

après les détails:

la fonction que je voudrais utiliser en python dans xh:

std::list<std::complex<double> > roots1(const double& d, const double& e); 

J'ai essayé quelques façons:

(1) xi:

%include <std_list.i> 
%include <std_complex.i> 

que j'essaie en IPython:

tmp = x.roots1(1.0, 2.0) 
len(tmp) 

et je me suis:

--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-5-9ebf7dab7cd9> in <module>() 
----> 1 len(tmp) 

TypeError: object of type 'SwigPyObject' has no len() 

et:

dir(tmp) 

retours:

[ 
... 
'acquire', 
'append', 
'disown', 
'next', 
'own'] 

(2) xi:

%include <std_list.i> 
%include <std_complex.i> 
namespace std { 
    %template(ComplexDouble)  complex<double>; 
} 

que, i eu erreur de compilation:

error: command 'swig' failed with exit status 1 
make: *** [py] Error 1 

(3) dans x.i:

%include <std_list.i> 
%include <std_complex.i> 
namespace std { 
    %template(ComplexDouble)  list<complex<double> >; 
} 

ou:

%include <std_list.i> 
%include <std_complex.i> 
namespace std { 
    %template(ComplexDouble)  list<complex>; 
} 

et je suis arrivé:

x_wrap.cpp:5673:32: error: ‘complex’ was not declared in this scope 
template <> struct traits<complex > { 
          ^

=============================================== =

(Mr./Ms./Mrs) m7thon me aider à trouver le problème. Dans mon contexte python:

Ubuntu: 45~14.04.1 
Python: 3.4.3 
SWIG: SWIG Version 2.0.11 
     Compiled with g++ [x86_64-unknown-linux-gnu] 
     Configured options: +pcre 

si définir le x.i comme:

%include <std_list.i> 
%include <std_complex.i> 
namespace std { 
    %template(ComplexList)  list<complex<double> >; 
} 

il compilera erreur. Mais cela fonctionne si x.i:

%include <std_list.i> 
%include <std_complex.i> 
%template(ComplexList) std::list< std::complex<double> >; 

Merci m7thon.

+0

Salut, j'ai réécrit la question. Pourriez-vous m'aider? Merci beaucoup – xhao79

Répondre

0

Cela fonctionne:

%include <std_list.i> 
%include <std_complex.i> 
%template(ComplexList) std::list<std::complex<double> >; 
... (your includes/function declarations) 

Je pense que votre version (3) devrait en fait également. Étrange que ce n'est pas le cas. Peut-être un bug SWIG.

+0

Oui, votre code fonctionne dans mon contexte python ('45 ~ 14.04.1-Ubuntu + Python 3.4.3'). Et l'information est SWIG ('SWIG version 2.0.11 compilé avec g ++ [x86_64-unknown-linux-gnu] Options: + Configuré pcre') – xhao79

+0

Merci beaucoup – xhao79

+0

Vous êtes les bienvenus. A titre indicatif: Vous n'avez pas besoin de/devez éditer votre question pour inclure la réponse et dire merci. C'est ce que la réponse (s) sont là pour. Un commentaire à la réponse est un endroit parfait pour un rapide merci. – m7thon

0

Pour être plus concis, vous pouvez utiliser l'ensemble namespace:

%include <std_list.i> 
%include <std_complex.i> 

using namespace std; 

%template(ComplexList) list<complex<double> >; 

Mais les versions proposées au départ d'inclure SWIG %template dans l'espace de noms std est pas une bonne idée.