2008-11-10 8 views
15

Je suis en train d'exposer cette fonction à Python en utilisant SWIG:Comment exposer std :: vector <int> comme une liste Python en utilisant SWIG?

std::vector<int> get_match_stats(); 

Et je veux SWIG générer du code d'emballage pour Python, je peux voir comme une liste d'entiers.

L'ajout de ce fichier au .i:

 
%include "typemaps.i" 
%include "std_vector.i" 

namespace std 
{ 
    %template(IntVector) vector<int>; 
} 

Je suis en SWIG Version 1.3.36 et appeler rasade avec -Wall et je reçois aucun avertissement.

Je suis en mesure d'avoir accès à une liste mais je reçois un tas d'avertissements lors de la compilation avec -Wall (avec g++ (GCC) 4.2.4) le code généré C++ qui disent:

 
    warning: dereferencing type-punned pointer will break strict-aliasing rules 

Suis-je exposer correctement la fonction? Si oui, que signifie l'avertissement?


Ce sont les lignes avant la ligne incriminée dans la même fonction:

 
SWIGINTERN PyObject *_wrap_IntVector_erase__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { 
    PyObject *resultobj = 0; 
    std::vector *arg1 = (std::vector *) 0 ; 
    std::vector::iterator arg2 ; 
    std::vector::iterator result; 
    void *argp1 = 0 ; 
    int res1 = 0 ; 
    swig::PySwigIterator *iter2 = 0 ; 
    int res2 ; 
    PyObject * obj0 = 0 ; 
    PyObject * obj1 = 0 ; 

    if (!PyArg_ParseTuple(args,(char *)"OO:IntVector_erase",&obj0,&obj1)) SWIG_fail; 
    res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0); 
    if (!SWIG_IsOK(res1)) { 
    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector_erase" "', argument " "1"" of type '" "std::vector *""'"); 
    } 
    arg1 = reinterpret_cast * >(argp1); 

Et ceci est la ligne incriminée:

 
    res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::PySwigIterator::descriptor(), 0); 

code plus que suit.

L'avertissement généré lors de la compilation avec g ++ 4.2.4:

 
swig_iss_wrap.cxx: In function ‘PyObject* _wrap_IntVector_erase__SWIG_0(PyObject*, PyObject*)’: 
swig_iss_wrap.cxx:5885: warning: dereferencing type-punned pointer will break strict-aliasing rules 

Répondre

15
%template(IntVector) vector<int>; 
+0

C'est ce que j'ai essayé et je reçois un tas d'avertissements lors de la compilation avec g ++. Des idées? –

+1

Quelle version de g ++ utilisez-vous? J'utilise 4.1.2 et je ne reçois aucun avertissement, même avec -Wall. Je ne me souviens pas des avertissements lorsque j'utilisais 3.3 ou plus. Notez le "" supplémentaire dans ce message qui manque dans le message d'origine. –

+0

Le était là, mais il n'était pas à l'affiche. Je l'ai réparé! –

0

Je n'ai pas beaucoup d'expérience avec Swig, mais êtes-vous #including votre fichier d'en-tête C++ dans votre fichier .i ? Essayez un (ou les deux) de

%include "myvector.h" 


%{ 
# include "myvector.h" 
%}