在Cython中的结构中使用指针数组

时间:2014-09-12 16:06:05

标签: python struct cython

我正在尝试围绕C库编写一个Cython包装器。我是Cython的新手,所以如果问题很明显,我会提前道歉。

在文件wrapper.pxd中,我定义了一个结构(简化示例):

cdef extern from "thiscouldbeyourlibrary.h":
    cdef struct foo:
        double **output

然后我有一个班级:

cdef class Bar:
    cdef wrapper.foo __stuff

    cdef do_something(self):
        self.__stuff.output = NULL

这失败了:

  

无法将'void *'转换为Python对象。

显然,Cython不能确定self .__ stuff.output总是一个指针。但我宣布它的类型和类是一个“cdef”类,所以我不明白为什么。

1 个答案:

答案 0 :(得分:1)

问题是NULLdouble **之间不兼容。您可以将其分配给charintvoid *,例如:

wrapper.pyd:

cdef extern from "thiscouldbeyourlibrary.h":
    cdef struct foo:
        char a
        int b
        void *c
        double **output

thiscouldbeyourlibrary.h:

struct foo
{ 
    char a;
    int b;
    void *c;
    double **output;
};

main.pyx:

cimport wrapper

cdef class Bar:
    cdef wrapper.foo __stuff
    def __init__(self):
        self.__stuff.a = <char>NULL
        self.__stuff.b = <int>NULL
        self.__stuff.c = NULL

def main():
    bar = Bar()
    print bar.__stuff.a
    print bar.__stuff.b

如果您之前为output分配了内存,则可以这样做:

self.__stuff.output[0] = NULL

没有分配就会崩溃......