将memoryview传递给C函数

20

我有一个声明如下的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

编译模块时,出现了“无法将类型 'long [:]' 分配给 'long *'”的错误。是否有方法可以在调用 C 函数之前不强制将 memoryview 转换回 numpy 数组来传递指针?

1个回答

23

如果底层数据是正确连续/步幅的,并且内存中至少有一个元素,则应该足以传递到第一个元素的指针(和可能的长度):

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

编辑:

确保“properly contiguous”的一种方法是添加“[::1]”。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接