18

SWIGを使用してこの関数をPythonに公開しようとしています。

std::vector<int> get_match_stats();

そして、SWIGにPythonのラッピングコードを生成させて、整数のリストとして表示できるようにします。

これを.iファイルに追加します。

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

名前空間std
{{
  %template(IntVector)vector <int>;
}

SWIG Version 1.3.36でswigを実行して呼び出して-Wallいますが、警告は表示されません。

リストにアクセスすることはできますが、生成されたC ++コードを-Wall(使用して)コンパイルすると、次のような警告が表示されます。g++ (GCC) 4.2.4

  警告:型のパンニングされたポインターの間接参照は、厳密なエイリアシング規則に違反します

関数を正しく公開していますか?もしそうなら、警告はどういう意味ですか?


これらは、同じ関数の問題のある行の前の行です。

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の結果;
  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 :: describeor()、0);

その後にさらにコードが続きます。

g++4.2.4でコンパイルするときに生成される警告は次のとおりです。

swig_iss_wrap.cxx:関数'PyObject * _wrap_IntVector_erase__SWIG_0(PyObject *、PyObject *)':
swig_iss_wrap.cxx:5885:警告:型のパンニングされたポインターを間接参照すると、厳密なエイリアシングルールが破られます
4

2 に答える 2

14
%template(IntVector) vector<int>;
于 2008-11-10T11:44:15.637 に答える
0

私は Swig の経験があまりありませんが、C++ ヘッダー ファイルを .i ファイルに #include していますか? のいずれか (または両方) を試してください。

%include "myvector.h"


%{
#   include "myvector.h"
%}
于 2008-12-15T16:40:34.130 に答える