2016-07-12 2 views
0

Say У меня есть следующий typedef struct в моем файле заголовка example.h:Как использовать указатель ЬурейеЕ структуры в Cython Тип Extension

typedef struct A A; 

Я Tring сделать Cython Тип расширения с указателем на A как класс переменная в test.pyx, а затем я вызвать функцию инициализации f на ссылки на A:

cdef class Test: 
    cdef A* a 

    def __cinit__(self): 
     self.a = a 
     f(&a) 
    ... 

Когда я компилирую `test.pyx, я в конечном итоге со следующими ошибками компиляции:

Error compiling Cython file: 
------------------------------------------------------------ 
... 

cdef class Test: 
    cdef A* a 

    def __cinit__(self): 
     self.a = a 
           ^
------------------------------------------------------------ 

test.pyx: undeclared name not builtin: a 

Error compiling Cython file: 
------------------------------------------------------------ 
... 

cdef class Test: 
    cdef A* a 

    def __cinit__(self): 
     self.a = a 
           ^
------------------------------------------------------------ 

test.pyx: Cannot convert Python object to 'A *' 

По-видимому, не распознает объект a, и он интерпретирует это как объект Python. Как я могу это исправить?

+0

Если это все определения Cython у вас есть, я думаю, вы должны прочитать Cython документацию и немного изучите примеры. –

+0

Спасибо, мистер. – Alex

ответ

1

Это потому, что вы должны объявить его, прежде чем использовать его. Например, вы имеете это в С-код example.h:

typedef struct struct_name{ 
    int a; 
    float b; 
}struct_alias; 

Тогда ваш файл .pyx должен выглядеть следующим образом:

cdef extern from "example.h": 
    ctypedef struct struct_alias: 
     int a 
     int b 

cdef class Test: 
    cdef A* a 

    def __cinit__(self): 
     self.a = a 
     f(&a) 
    ... 
Смежные вопросы