来自 C++ 的 Cython 回调

Cython callback from C++

提问人:George Huang 提问时间:8/28/2023 最后编辑:cocomacGeorge Huang 更新时间:8/28/2023 访问量:55

问:

我正在尝试让 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

有人可以帮忙吗?

C++ 回调 Cython

评论


答:

0赞 DavidW 8/28/2023 #1
wrapper(<callback_t>&CyClass.callback)

你有演员表的事实告诉你这里出了点问题。也就是说,它有完全错误的签名。它实际上需要两个参数 - 指针和浮点指针。CyClass.callbackCyClass

您可能很想尝试使用绑定的 cdef 方法。这也行不通 - C 函数指针根本没有位置来存储任何额外的数据。

请参阅 https://stackoverflow.com/a/68326277/4657412 类似的问题,该问题提出了一些可能的解决方案(没有一个非常令人满意)