2008-11-10 4 views
15

SWIG를 사용하여이 함수를 Python에 노출하려고합니다.std :: vector <int>을 SWIG를 사용하여 파이썬리스트로 노출시키는 방법?

std::vector<int> get_match_stats(); 

그리고 SWIG가 파이썬 용 코드를 생성하여 정수 목록으로 볼 수있게하고 싶습니다.

.i 파일에 추가 :

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

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

SWIG Version 1.3.36를 실행하고 swig를 -Wall으로 호출하면 경고 메시지가 표시되지 않습니다.

목록에 액세스 할 수 있지만 -Wall ( g++ (GCC) 4.2.4 포함)을 사용하여 컴파일 할 때 다음과 같은 경고가 나타납니다.

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

함수를 올바르게 표시하고 있습니까? 그렇다면 경고는 무엇을 의미합니까?


같은 함수에서 문제가되는 줄 앞에있는 줄은 다음과 같습니다.

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

그리고 이것은 잘못된 줄입니다.

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

더 많은 코드가 있습니다.

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 

답변

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

그게 제가 시도한 것이고 g ++로 컴파일 할 때 많은 경고를받습니다. 어떤 아이디어? –

+1

g ++의 어떤 버전을 사용하고 있습니까? 나는 4.1.2를 사용 중이며, -Wall을 사용한다고해도 경고 메시지가 표시되지 않습니다. 3.3이나 그 중 하나를 사용할 때 어떤 경고도 기억이 안납니다. 이 게시물의 추가 게시물 ""은 원래 게시물에 없습니다. –

+0

가 있었지만 표시되지 않았습니다. 고쳤다! –

0

나는 꿀꺽 꿀꺽과 많은 경험을 가지고 있지 않지만, 당신이 당신의 .I 파일에 C++ 헤더 파일을 제대로 #include된다 ? 하나 또는 둘 다 시도해보십시오.

%include "myvector.h" 


%{ 
# include "myvector.h" 
%}