2016-07-12 54 views
0

说我有以下typedef struct在我的头文件example.h到typedef结构:如何使用指针用Cython扩展类型

typedef struct A A; 

我特林让一个用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

这是因为您必须在使用之前声明它。比如你有这样的C代码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) 
    ...