2017-02-09 9 views
0

私はPython 3.5モジュールをC++で書いています.2DリストをPythonからC++に、好ましくはstd :: vectorにフィードしたいと思います。作業コードは以下の通りですが、データのコピーを避け、2次元配列をアドレス& input_valueにポイントすることを期待していました。これを行うより良い方法はありますか?2d pythonリストをC++拡張モジュールに効率的に与える方法

PyObject* CheckTerminal(PyObject* self, PyObject* args) 
{ 
    PyObject *input_value; 
    std::vector<std::vector<bool>> cArray; 

    if (!PyArg_ParseTuple(args, "O", &input_value)) 
    { 
    std::cout << "\nerror\n"; 
    goto error; 
    } 

    int count = (int)PyList_Size(input_value); 
    PyObject *ptemp,*vals; 

    for (int i = 0; i < count; i++) 
    { 
    cArray.push_back(std::vector<bool>()); 
    ptemp = PyList_GetItem(input_value, i); 
    int count2 = (int)PyList_Size(ptemp); 
    for (int j = 0; j < count2; ++j) 
    { 

     vals = PyList_GetItem(ptemp, j); 
     int v = PyLong_AsLong(vals); 

     if (v == 1) 
     { 
      cArray[i].push_back(true); 
     } 
     else if (v == 0) 
     { 
      cArray[i].push_back(false); 
     } 

    } 

    } 

    return PyBool_FromLong(g.CheckTerminal(&cArray)); 

error: 
    return 0; 
} 

このモジュールをインポートした後、私はこれをpythonから呼び出します。

p=[[1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0],[1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0],[1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0]] 
print(nInARow.CheckTerminal(p)) 
+0

問題は、Pythonリストは値の配列ではなく、配列の配列であることです。 –

答えて

0

私はC++配列に変換する代わりにPyObjectを使用してこれを解決しました。 pyオブジェクト内のデータにアクセスするには、PyList_GetItemまたはPyList_GetSliceを実行します。

// Checks if given boardState is terminal. 
PyObject* NInARowGame::CheckTerminal(PyObject* input_value) 
{ 

    //this is just check, should be the same number of planes. 
    PyObject *p1 = PyList_GetItem(input_value, 0); 
    PyObject *p2 = PyList_GetItem(input_value, 1); 
    Py_INCREF(p1); 
    Py_INCREF(p2); 

    int count = (int)PyList_Size(input_value); 

    auto nK = this->winsK.size(); 

    for (int i = 0; i<nK; ++i) 
    {//for each winning kernel do the following 
    //int ksizeY = k[0].size(); 

     if (compareK(p1, &this->winsK[i])) 
     { 
      winner = 1; 
      return Py_True; 

     } 
     if (compareK(p2, &this->winsK[i])) 
     { 
      winner = 2; 
      return Py_True; 
     } 


    } 
    PyObject *m = this->GetMoves(); 
    int counter = (int)PyList_Size(m); 

    if (counter==0) 
    { 
     winner = 3; 
     return Py_True; 

    } 
    Py_DECREF(p1); 
    Py_DECREF(p2); 
    return Py_False; 
} 
+0

完全性のために、利用可能な定義済みのスクリプトもあります:#define PyList_GET_ITEM(op、i)(((PyListObject *)(op)) - > ob_item [i]) –

関連する問題