代码如下:
c++ lib
//.h
static complex<double>* randomComplexArray(long n);
//.cpp
complex<double>* randomComplexArray(long n){
complex<double>* res = new complex<double>[n];
...
return res; //返回的指针
}
pybuind11
.def_static("randomCircleArray", &randomCircleArray)
python
mvec1 = randomComplexArray(1024)
foo(mvec1)
# Segmentation fault (core dumped)
如果是一般类型可以用 ctypes,但是没找到合适的解决方案,
想问下有经验的朋友知道怎么做吗?十分感谢~
1
inframe 2019-09-22 13:21:09 +08:00 1
2 个可选策略
- 转字符串传回来,反正 py 转换很方便 - 拆成实部虚部两部分传回来,这样套路就多了,比如转换为 python 的 tuple,list 等等,反正是 py 的可以识别的对象,需要多写一个类型转换函数解包结果封装一下 |
2
Huelse OP @inframe #1 主要是计算都是放在 c++那边的,我想就只传个指针过去给 lib 计算,python 就当个中转站
|
3
wwqgtxx 2019-09-22 13:38:46 +08:00 via iPhone 1
我的做法是用纯 c 封装个包装函数,参数传递 void*然后强制类型转换到 c++层操作
|
4
Huelse OP |
5
wwqgtxx 2019-09-22 23:53:43 +08:00
@Huelse pybind11 我不太了解,用 ctypes 的话用 c_void_p,用 cffi 的话直接 cdef 一个 void*然后把接受到指针传回给 C 函数
|
6
zhoujinjing09 2019-10-22 23:56:05 +08:00
用 py::cast 把 res 转成 py::object?
|