代码之家  ›  专栏  ›  技术社区  ›  Patrick Machado

在python ctypes中从c++dll传递向量

  •  0
  • Patrick Machado  · 技术社区  · 6 年前

    我有一个。使用c++编写的dll extern "C" ,此函数称为BOLHA,并返回一个double。

    问题是BOLHA有一个 vector<double> 在争论中。

    extern "C" myDLL_API double BOLHA(vector<double> OI);
    

    事实上,由于 外部“C” 我相信这个向量会变成指针,所以我尝试如下加载函数。

    mydll = cdll.LoadLibrary("_DLL.dll")
    
    func = mydll.BOLHA
    
    func.argtypes = [POINTER(c_double)]
    func.restype = c_double
    
    returnarray = (c_double * 2)(0.047948, 0.005994)
    
    func(returnarray)   
    

    但我得到以下错误。

    [Error -529697949] Windows Error 0xE06D7363
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   shoosh    6 年前

    事实上,由于外部的“C”,我相信这个向量会变成指针

    这是错误的。默认情况下,没有任何机制可以实现这一点。 你的 BOLHA() 函数需要接收 double* 然后将其转换为 vector<double> 或者只使用原始指针。

    如果您想让它与 向量(<双倍(>); 签名,您需要一些东西来完成将指针转换为向量的工作。 boost::python 可以做到这一点,但这需要使用的DLL是python模块,而不仅仅是任何DLL。

    如果您具有以下功能:

    extern "C" myDLL_API double BOLHA(vector<double> OI);
    

    您需要声明一个新函数:

    extern "C" myDLL_API double BOLHA_raw(double* ptr, int size) {
        vector<double> v(ptr, ptr+size);
        return BOLHA(v);
    }