我的结构如下
struct _name{
void* person[3];
}name;
我试图将元素复制到python数组中,但是没有用。
答案 0 :(得分:0)
您想如何使用绑定结果?在Python中没有void*
这样的东西,除非您可能想使用胶囊,所以最容易使用的是适当大小的整数类型,该整数类型随后可以传递给ctypes,反弹等。 / p>
在cppyy中,我正是这样做的。示例:
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)
>>>
这些值又恰好是它们的值,因为它们没有被struct _name
的构造函数初始化。