2016-11-27 66 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