pybind11 - 如何使用 pybind11 绑定 void 数组
问题描述
我的结构如下
struct _name{
void* person[3];
}name;
我试图将元素复制到 python 数组中,但没有成功。
解决方案
你想如何使用绑定的结果?在 Python中没有这样的东西 aa void*
,除非你想使用胶囊,所以最容易使用的是适当大小的整数类型,随后可以将其交给 ctypes、反弹等。
在 cpyy 中,我正是这样做的。例子:
import cppyy
cppyy.cppdef("""
typedef struct _name{
void* person[3];
} name;
""")
n = cppyy.gbl.name()
print(n.person[0])
它将第一个指针指向的任何内容(在此示例中未初始化)打印为整数地址,并cppyy.bind_object()
允许将指针重新绑定到代理。
要在 pybind11 中执行相同的操作,您可以执行以下操作:
#include <pybind11/pybind11.h>
#include <pybind11/pytypes.h>
#include <pybind11/numpy.h>
typedef struct _name {
void* person[3];
} name;
PYBIND11_MODULE(name, m)
{
pybind11::class_<name>(m, "name", pybind11::buffer_protocol())
.def(pybind11::init<>())
.def_property("person", [](name &n) -> pybind11::array {
auto dtype = pybind11::dtype(pybind11::format_descriptor<uintptr_t>::format());
auto base = pybind11::array(dtype, {3}, {sizeof(uintptr_t)});
return pybind11::array(
dtype, {3}, {sizeof(uintptr_t)}, n.person, base);
}, [](name& n) {});
}
它为您提供了正确整数类型和长度的 numpy 数组。示例使用:
>>> import name
>>> n = name.name()
>>> n.person
array([0, 0, 0], dtype=uint64)
>>>
这些值再次发生在哪里,因为它们是未初始化的 w/oa 构造函数struct _name
。
推荐阅读
- json - 使用与 ImportJSON 相邻的单元格会引发错误:数组结果未展开,因为它会覆盖数据
- swift - Apple Watch 并发症列表中这些图标的名称是什么?我在哪里可以访问它们?
- powerbi - 需要帮助创建 DAX 度量以按 groupkey 和 max date 计算不同状态
- r - R:使用 CoxPH 预测和绘制生存曲线
- javascript - 如何在单击 div 时在箭头函数中传递数据,而不作为参数传递,也不在 dom 中显示值?
- flutter - 如何检测颤振应用程序被杀死或终止
- python - Python DataFrame 拆分结果为 NaN
- django - 使用 PostgreSQL 时 django 中 TextField 的最大长度是多少
- android - Android如何隐藏意图发送者包?
- c++ - 为什么我的嵌套 while 循环无限循环?