提问人:George Huang 提问时间:8/28/2023 最后编辑:cocomacGeorge Huang 更新时间:8/28/2023 访问量:55
来自 C++ 的 Cython 回调
Cython callback from C++
问:
我正在尝试让 c++ 调用用 cython(函数指针)编写的回调函数。但是我从 C++ 在 Cython 内部获得的值似乎是垃圾值,并导致 seg 错误。
下面是代码片段
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 秒一次),但问题是似乎不同/损坏;我尝试以类似的方式传入,但值也非常不同(Cython 中的垃圾值)float*
int
有人可以帮忙吗?
答:
0赞
DavidW
8/28/2023
#1
wrapper(<callback_t>&CyClass.callback)
你有演员表的事实告诉你这里出了点问题。也就是说,它有完全错误的签名。它实际上需要两个参数 - 指针和浮点指针。CyClass.callback
CyClass
您可能很想尝试使用绑定的 cdef 方法。这也行不通 - C 函数指针根本没有位置来存储任何额外的数据。
请参阅 https://stackoverflow.com/a/68326277/4657412 类似的问题,该问题提出了一些可能的解决方案(没有一个非常令人满意)
上一个:我有一个函数,当我单击检查它时,它一次又一次地调用函数
下一个:C++ 线程结束
评论