Huelse
V2EX  ›  C++

请问如何在 Python 中向动库的函数传参复数模板指针

  •  
  •   Huelse · Sep 22, 2019 · 3740 views
    This topic created in 2431 days ago, the information mentioned may be changed or developed.

    代码如下:

    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,但是没找到合适的解决方案,

    想问下有经验的朋友知道怎么做吗?十分感谢~

    6 replies    2019-10-22 23:56:05 +08:00
    inframe
        1
    inframe  
       Sep 22, 2019   ❤️ 1
    2 个可选策略
    - 转字符串传回来,反正 py 转换很方便
    - 拆成实部虚部两部分传回来,这样套路就多了,比如转换为 python 的 tuple,list 等等,反正是 py 的可以识别的对象,需要多写一个类型转换函数解包结果封装一下
    Huelse
        2
    Huelse  
    OP
       Sep 22, 2019
    @inframe #1 主要是计算都是放在 c++那边的,我想就只传个指针过去给 lib 计算,python 就当个中转站
    wwqgtxx
        3
    wwqgtxx  
       Sep 22, 2019 via iPhone   ❤️ 1
    我的做法是用纯 c 封装个包装函数,参数传递 void*然后强制类型转换到 c++层操作
    Huelse
        4
    Huelse  
    OP
       Sep 22, 2019
    @wwqgtxx #3 请问,我就想能把 c++返回到 Python 的数组指针

    再从 Python 中传参到 c++函数中该怎么做呀
    wwqgtxx
        5
    wwqgtxx  
       Sep 22, 2019
    @Huelse pybind11 我不太了解,用 ctypes 的话用 c_void_p,用 cffi 的话直接 cdef 一个 void*然后把接受到指针传回给 C 函数
    zhoujinjing09
        6
    zhoujinjing09  
       Oct 22, 2019
    用 py::cast 把 res 转成 py::object?
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5629 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 48ms · UTC 06:06 · PVG 14:06 · LAX 23:06 · JFK 02:06
    ♥ Do have faith in what you're doing.