私のコードで作業しているときにメッセージProgram received signal SIGSEGV, Segmentation fault
が出ます。私のプログラムは、定義された構造体を持つCモジュールを呼び出します。python3(C)のセグメンテーションフォールト
import GL
g = GL.Graph("A?")
g.order()
:私はこのようなコンストラクタを使用しているとき - 単純に、私のオブジェクトは機能fromString
によって初期化されますモジュールの構造体
typedef struct {
char* str;
int order;
int list[10][10];
} Graph;
定義
static PyMethodDef GraphMethods[] = {
{ "fromString",(PyCFunction)Graph__fromString,METH_VARARGS,"desc" },
{ "order",(PyCFunction)Graph_order,METH_NOARGS,"desc" },
{ NULL }
} ;
static PyTypeObject GraphType = {
PyVarObject_HEAD_INIT(NULL,0) // inicjalizacja
"GL.Graph", // nazwa
sizeof(Graph), // rozmiar
0, //
(destructor)Graph__del__, // destruktor
0,0,0,0,0,0,0,0,0,0, //
(reprfunc)Graph__str__, // obiekt -> napis
0,0,0, //
Py_TPFLAGS_DEFAULT, //
"desc.", // opis
0,0,0,0,0,0, //
GraphMethods, // metody
0,0,0,0,0,0,0, //
(initproc)Graph__init__, // inicjalizator
0, //
(newfunc)Graph__new__ // konstruktor
} ;
の
定義(初期化機能)
static int Graph__init__(Graph *self, PyObject *args) {
Graph__fromString(self, args);
printf("ORDER: %d\n", self->order);
return 0;
}
プログラムスローエラーg.order()
にスローされます。
static PyObject * Graph_order(Graph *self) {
int result = self->order;
return Py_BuildValue("i", result);
}
PyObject * Graph__fromString(Graph * self, PyObject *args) {
char * text;
// Check if user passed the argument
if (PyArg_ParseTuple(args, "s", &text)) {
self->str = text;
int i, k;
int n = strlen(text);
/* magic goes here, but im sure this is working */
}
Py_RETURN_NONE;
}
私は間違っていますか?このコードは、プレーンCで働いていた、私は、Pythonにそれを移動したとき、それは、コンストラクタの後に呼び出されるすべてのメソッドにクラッシュ...
'Graph'構造体に' PyObject_HEAD'マクロが含まれていることが必要です。 –
ああ、 'str'フィールドに' PyObject_HEAD'を追加したときに動作しているようです。ありがとう、しかし...あなたは説明することができます、なぜ今働いていますか? – deem