2012-01-12 13 views
2

私はPythonから、std :: listをパラメータとして返すC++のメソッドを呼び出そうとしています。ここでSWIG C++ to Python:Pythonの引数としてstd :: listを返す

は、C++のプロトタイプである:ここでは

void FindAllServices(int id, std::list<Service*> &services) 

はSTDのための私のタイプマップです::リスト:

%typemap(in) (std::list<Service*> &) (std::list<Service*> temp) { 
    $1 = &temp; 
} 

%typemap(argout) (std::list<Service*>&) { 
    Py_XDECREF($result); /* Blow away any previous result */ 
    $result = PyList_New((*$1).size()); 
    qList<Service*>::iterator it = (*$1).begin(); 
    int i = 0; 
    while(it != (*$1).end()) { 
     PyList_SetItem($result,i,SWIG_NewPointerObj((void*)(*it), SWIGTYPE_p_Service, 0)); 
     it++; i++; 
    } 
} 

私は、Pythonから関数を呼び出すときに、私はC++のコードで破ることができるし、すべてがうまくいくことを確認してください(つまり、いくつかのサービスポインタがリストにコピーされています)。しかし、私がPythonで取得するリストは空です。

私が間違っていると思われることはありますか?

ありがとうございます!

+0

Swigには、一部のSTLクラス用の事前定義されたタイプマップがあります。 SWIGの 'Lib/Python'ディレクトリを参照してください。 –

答えて

0

あなたのargoutコードは新しいリストを作成します。元のリストへの参照を取得し、代わりにそれを変更する必要があります。私は豚を知らないので、私はそれを行う方法を知らない。

私は通常、新しいリストが返されるように、それをラップして、渡されたリストを変更します。それはC++のイディオムですが、実際にはPythonのイディオムではありません。

+0

私は$ resultがargoutパラメータを置き換えると考えていました。とにかく私はC++でそれをすべて行う方法を見つける。ご協力いただきありがとうございます。 –

0

ここに私が使用しているコードがあります。それはとてもうまくいく。

%typemap(out) std::list<AbnormalCondition> 
{ 
    PyObject* outList = PyList_New(0); 

    int error; 

    std::list<AbnormalCondition>::iterator it; 
    for (it=$1.begin() ; it != $1.end(); it++) 
    { 
     AbnormalCondition object = (*it); 

     PyObject* pyAbnormalCondition = SWIG_NewPointerObj((new AbnormalCondition(static_cast< const AbnormalCondition& >(object))), SWIGTYPE_p_AbnormalCondition, SWIG_POINTER_OWN | 0); 

     error = PyList_Append(outList, pyAbnormalCondition); 
     Py_DECREF(pyAbnormalCondition); 
     if (error) SWIG_fail;  
    } 

    $result = outList; 
} 

%typemap(in) std::list<AbnormalCondition> 
{ 
    //$input is the PyObject 
    //$1 is the parameter 

    if (PyList_Check($input)) 
    { 
     std::list<AbnormalCondition> listTemp; 

     for(int i = 0; i<PyList_Size($input); i++) 
     { 
      PyObject* pyListItem = PyList_GetItem($input, i); 

      AbnormalCondition* arg2 = (AbnormalCondition *) 0 ; 

      int res1 = 0; 
      void *argp1; 

      res1 = SWIG_ConvertPtr(pyListItem, &argp1, SWIGTYPE_p_AbnormalCondition, 0 | 0); 
      if (!SWIG_IsOK(res1)) 
      { 
       PyErr_SetString(PyExc_TypeError,"List must only contain AbnormalCondition objects"); 
       return NULL; 
      } 
      if (!argp1) 
      { 
       PyErr_SetString(PyExc_TypeError,"Invalid null reference for object AbnormalCondition"); 
       return NULL; 
      } 

      arg2 = reinterpret_cast< AbnormalCondition * >(argp1); 
      listTemp.push_back(*arg2); 
     } 

     $1 = listTemp; 
    } 
    else 
    { 
     PyErr_SetString(PyExc_TypeError,"Wrong argument type, list expected"); 
     return NULL; 
    } 
} 
関連する問題