C言語でPythonモジュールの続きになります!!
elsammit-beginnerblg.hatenablog.com
前回は誤ったソースを展開してしまいました。。。
C言語Pythonモジュールのバブルソートですが、出来ましたので報告!!
結論から申しますと、PyObjectとPyListObjectの扱いを誤っていたためでした(泣)。
C言語Pythonモジュールのバブルソートはこちらになります。
static PyObject* c_bubble(PyObject *self, PyObject *args){ PyObject *receive_list,*buf; // 配列を抽出 receive_list = args //receive_list = PySequence_List(args); for(int i=0;i<PyList_Size(receive_list);i++){ for(int j=i+1;j<PyList_Size(receive_list);j++){ if(PyLong_AsLong(PyList_GetItem(receive_list,j-1)) > PyLong_AsLong(PyList_GetItem(receive_list,j))){ *buf = receive_list[j-1]; receive_list[j-1] = receive_list[j]; receive_list[j] = *buf; } } } return receive_list; // 配列を返却 }
自分が誤っていた点は2つ!!
①PyList_GetItem APIで返ってくる型はPyObjectであるため、整数型に変換するためにPyLong_AsLong APIが必要
②PyList型のオブジェクトから要素数を得るためにはPyList_Size APIを用いなければならない
誤っていたソースの時は渡されたPyList型のオブジェクト要素数によらず、4でループが回っておりました。。。
ちゃんと、仕様書を読め!!ということですね。。。
docs.python.org
docs.python.org