传递标准:来自C+的向量+;通过Ctypes访问Python:获取无意义的值

传递标准:来自C+的向量+;通过Ctypes访问Python:获取无意义的值,python,c++,ctypes,Python,C++,Ctypes,我试着跟着这条路走,但我被卡住了。我试图从我的C++代码(在外部C < /COD>中)传递一个 STD:vector < /代码>到Python。这就是我所拥有的: extern 'C' { double* returnQ() { std::vector<double> v = {7.5, 5.5, 16.5, 8.5}; std::cout<<"Print first element:"<<vec[0]<<

我试着跟着这条路走,但我被卡住了。我试图从我的C++代码(在<代码>外部C < /COD>中)传递一个<代码> STD:vector < /代码>到Python。这就是我所拥有的:

extern 'C' {
    double* returnQ() {
        std::vector<double> v = {7.5, 5.5, 16.5, 8.5};
        std::cout<<"Print first element:"<<vec[0]<<std::endl;
        return v.data(); }
}

然而,当我在Python中调用
q()
时,会得到一个随机数数组。我不知道为什么?

如注释中所述,向量是一个局部变量,从函数返回后被销毁。一种有效的方法是让Python管理内存并将数据复制到内存中

测试.cpp

#include <vector>
#include <cstring>

#define API __declspec(dllexport) // Windows-specific export

// Must pass double[4] array...
extern "C" API void returnQ(double* data) {
    std::vector<double> v = {7.5, 5.5, 16.5, 8.5};
    // Of course, you could write directly to "data" without the vector...
    std::memcpy(data,v.data(),v.size() * sizeof v[0]);
}

它是
restype
,而不是
restypes
,而且您还返回了一个悬空指针。为什么会悬空?我从未删除过
vec
@tryingtosolve vector,当它的作用域消失时,即函数结束时,它就消失了,它所保存的所有数据也随之消失。此外,您的代码无法编译,因此很难理解您所说的内容。
v
vec
是一回事吗?@xaxxon那我该怎么办?把它存储在一个本地C++数组中?@尝试正确的编写代码的方式是情境的,而且在你的问题中没有足够的上下文来给我提供建议。
#include <vector>
#include <cstring>

#define API __declspec(dllexport) // Windows-specific export

// Must pass double[4] array...
extern "C" API void returnQ(double* data) {
    std::vector<double> v = {7.5, 5.5, 16.5, 8.5};
    // Of course, you could write directly to "data" without the vector...
    std::memcpy(data,v.data(),v.size() * sizeof v[0]);
}
>>> from ctypes import *
>>> dll = CDLL('test')
>>> dll.returnQ.argtypes = POINTER(c_double),
>>> dll.returnQ.restype = None
>>> data = (c_double * 4)()  # equivalent to C++ double[4]
>>> dll.returnQ(data)
>>> list(data)
[7.5, 5.5, 16.5, 8.5]