2016-11-27 2 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() 

(функция инициализации)

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' - это отладочная переменная для меня, но когда я добавляю этот макрос в другой, он не работает. Я хотел бы сделать «список» аннотированным этим макросом? – deem

+0

Я не уверен, что понимаю ваш вопрос, что вы имеете в виду? –

+0

Я спрашиваю, могу ли я использовать этот макрос в любом поле в структуре, или это поле должно быть уникальным для каждого графика? – deem

Смежные вопросы