传递memoryview到C函数(Passing memoryview to C function)

2019-07-18 23:04发布

我有一个C函数声明如下:

void getIndexOfState(long *p, long C, long G, long B, long *state);

现在我用Cython包装代码使用从numpy的数组缓冲区语法:

cpdef int getIndexOfState(self, np.ndarray[np.int_t, ndim=1, mode="c"] s):
    cdef long out
    getIndexOfState(&out, self.C, self.G, self.B, <long*> s.data)
    return out

我想用新的memoryview语法,我的问题是,我怎么能使用memoryview时传递指针数据?

我试过了:

cpdef int getIndexOfState(self, long[:] s):
    cdef long out
    getIndexOfState(&out, self.C, self.G, self.B, s)
    return out

其提出的“不能分配型‘长[:]’到‘长*’”错误,当我试图编译模块。 有什么办法可以传递指针而不调用C函数前强迫的memoryview回numpy的阵列?

Answer 1:

如果底层的数据是正确的连续/跨距并且存在至少一个元件是在所述存储器中,那么它应该足以将指针传递到所述第一元件(也许的长度):

getIndexOfState(&out, self.C, self.G, self.B, &s[0])

编辑:

确保“正确的连续”的一种方式应该是增加了“[:: 1]”。

cpdef int getIndexOfState(self, long[::1] s):
    cdef long out
    getIndexOfState(&out, self.C, self.G, self.B, &s[0])
    return out


文章来源: Passing memoryview to C function