Как представить std::vector<int> в виде списка Python с помощью SWIG?

StackOverflow https://stackoverflow.com/questions/276769

  •  07-07-2019
  •  | 
  •  

Вопрос

Я пытаюсь предоставить эту функцию Python с помощью SWIG:

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 и зовущий глоток с -Wall и я не получаю никаких предупреждений.

Я могу получить доступ к списку, но я получаю кучу предупреждений при компиляции с -Wallg++ (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, но включаете ли вы # свой заголовочный файл C ++ в свой файл .i?Попробуйте одно (или оба) из

%include "myvector.h"


%{
#   include "myvector.h"
%}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top