来自 C++ 的 Cython 回调

问题描述 投票:0回答:1

我试图让 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中的垃圾值)

有人可以帮忙吗?

c++ callback cython
1个回答
0
投票
wrapper(<callback_t>&CyClass.callback)

事实上你的演员阵容告诉你这里出了问题。也就是说

CyClass.callback
的签名完全错误。它实际上需要两个参数 - 一个
CyClass
指针和一个浮点指针。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.