gpt4 book ai didi

python - 将 memoryview 传递给 C 函数

转载 作者:太空狗 更新时间:2023-10-29 16:55:55 25 4
gpt4 key购买 nike

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

最佳答案

如果基础数据是properly contiguous/strided并且内存中至少有一个元素,那么传递一个指向第一个元素(可能还有长度)的指针就足够了:

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

关于python - 将 memoryview 传递给 C 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14584439/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com