やりたいこと・知りたい事
やりたいこと
- 表題にある通り、Cで作ったポインタ引数のある関数をPythonで使用したい。
そのため、下記のような関数のラッパーファイルを作成するとき、どのように記載したら良いか知りたい。
- 下記の関数はポインタを使用しない方法でも実装できるが、後学のため、ポインタを関数の引数に置くことを条件としている。
c
1void pointer_func(int n1,int n2,int *sum,int *diff){ 2 *sum = n1 + n2; 3 *diff = (n1 > n2) ? n1 -n2 : n2 - n1; 4} 5 6
作成したラッパーファイル・呼び出し
作成したラッパーファイル
c
1#include "/usr/~~~/python3.8/Python.h" 2 3extern void pointer_func(int n1,int n2,int *sum,int *diff); 4PyObject* f_pointer_func(PyObject* self, PyObject* args){ 5 6 int n1,n2; 7 int* sum; 8 int* diff; 9 10 //変数 int* sum,int* diff に使用できる "" がわからない 11 if (!PyArg_ParseTuple(args, "iiii" ,&n1,&n2,&sum,&diff)){ 12 return NULL; 13 } 14 15 pointer_func(n1,n2,sum,diff); 16 return Py_BuildValue(""); 17} 18 19 20static PyMethodDef methods[] = { 21 {"pointer_func", f_pointer_func, METH_VARARGS, "pointer_ch" }, 22 {NULL} 23}; 24 25static struct PyModuleDef pointer_check = 26{ 27 PyModuleDef_HEAD_INIT, 28 "pointer_check", 29 "", 30 -1, 31 methods 32}; 33 34PyMODINIT_FUNC PyInit_pointer_check(void) 35{ 36 return PyModule_Create(&pointer_check); 37} 38
呼び出し
コンパイルした後、下記のようなファイルを作成し、import と呼び出しをした。
Python
1import pointer_check as ptc 2wa = 0 3sa = 0 4ptc.pointer_func(10,20,wa,sa);
###エラーメッセージ
segmentation fault (core dumped)
調べたこと・試してること
リファレンスの PyArg_ParseTuple() の項目を参照してもポインタ引数を扱うものが見当たらないため質問しました。
別途で
PyCapsule_New がポインタを格納できると記載されていたので、下記の参考資料のURLを見ながら引数単体で使用できないか調べています。
補足情報・参考資料
Python/C API リファレンスマニュアル
PyArg_ParseTuple
https://docs.python.org/ja/3/c-api/arg.html?highlight=pyarg_parsetuple#c.PyArg_ParseTuple
カプセル
https://docs.python.org/ja/3/c-api/capsule.html
PythonのC/C++拡張パターン - ポインタ
https://qiita.com/junkoda/items/2b1eda7569186809ca14
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/07/29 08:04