SWIG를 사용하여 std::Vector<int>를 Python 목록으로 노출하는 방법은 무엇입니까?
문제
SWIG를 사용하여 이 함수를 Python에 노출하려고 합니다.
std::vector<int> get_match_stats();
그리고 SWIG가 Python용 래핑 코드를 생성하여 정수 목록으로 볼 수 있기를 원합니다.
이것을 .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
) 생성된 C++ 코드는 다음과 같습니다.
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
해결책
%template(IntVector) vector<int>;
다른 팁
저는 Swig에 대한 경험이 많지 않지만 #.i 파일에 C++ 헤더 파일을 포함하고 있습니까?다음 중 하나(또는 둘 다)를 시도해 보세요.
%include "myvector.h"
%{
# include "myvector.h"
%}
제휴하지 않습니다 StackOverflow