2016-11-27 67 views
0

我在使用我的代碼時收到消息Program received signal SIGSEGV, Segmentation fault。我的程序使用已定義的結構調用C模塊。python3中的分段錯誤(C)

結構

模塊的
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 
} ; 

簡單地說,我的對象被按功能fromString初始化 - 當我使用這樣的構造:

import GL 

g = GL.Graph("A?") 
g.order() 

(init函數)

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,它崩潰的每一個構造後調用的方法...

+0

我很確定你需要'Graph'結構包含'PyObject_HEAD'宏。 –

+0

哦,它似乎現在正在工作,當我將'PyObject_HEAD'添加到'str'字段。謝謝,但是......你能解釋一下,爲什麼它現在在工作? – deem

回答

1

你的結構缺少PyObject_HEAD宏:

typedef struct { 
    PyObject_HEAD 
    char* str; 
    int order; 
    int list[10][10]; 
} Graph; 

擴建後這最終(中其他的東西)也有一個指向這個類型的指針,你錯過了這個事實可能會導致整個事件被炸燬。

+0

我有一個問題 - 由這個宏標記的字段必須是唯一的嗎?字段'str'是我的調試變量,但是當我將這個宏添加到另一個時,它不起作用。我想通過這個宏製作'list'註釋? – deem

+0

我不確定我是否理解你的問題,你的意思是獨一無二的? –

+0

我問我是否可以在struct中的任何字段上使用這個宏,或者這個字段對於每個圖都應該是唯一的? – deem