我试图让 C++ 调用用 cython (函数指针)编写的回调函数。但是我从 C++ 在 Cython 中获得的值似乎是垃圾值,并导致段错误。
这是代码片段
C++ 内部
typedef void (*callback)(float *vec);
class CppClass{
void set_callback(callback c) { this->c = c; }
}
// when needed inside CppClass
this->c(vec);
然后,我有一个 C++ 包装器(所以我不需要在 Cython 中定义太多复杂的东西)来接受来自 Cython 的回调并创建
CppClass
void wrapper(callback c) {
CppClass *cls = new CppClass();
cls->set_callback(c);
}
对于 Cython 部分,我拥有什么
cdef extern from "wrapper.h":
cdef void wapper(void (*callback)(float*))
ctypedef void (*callback_t)(float*)
cdef class CyClass:
cdef void init(self):
wrapper(<callback_t>&CyClass.callback)
cdef void callback(self, float *vec):
print(vec[0])
现在 Cython 回调被成功调用(实际上每 1 秒),但问题是
float*
似乎不同/损坏;我尝试以类似的方式传入int
,值也有很大不同(Cython中的垃圾值)
有人可以帮忙吗?
wrapper(<callback_t>&CyClass.callback)
事实上你的演员阵容告诉你这里出了问题。也就是说
CyClass.callback
的签名完全错误。它实际上需要两个参数 - 一个 CyClass
指针和一个浮点指针。
您可能会想尝试使用绑定的 cdef 方法。这也行不通——C 函数指针根本没有地方存储任何额外的数据。
请参阅https://stackoverflow.com/a/68326277/4657412了解类似的问题,提出一些可能的解决方案(没有一个非常令人满意)