将std :: vector <int>转换为原始内存中的数组

时间:2018-06-13 10:41:39

标签: python c++ ctypes

我正在使用ctypes为c ++库创建一个python接口。我知道这不推荐,但我不能修改有问题的dll,所以一切都必须在python包装器中发生。

我们假设我们已将此函数编译到dll中:

vector<int> vectortest() {
    return { 1, 2, 3 };
}

我的python脚本看起来像这样:

# [ setup dll ... ]
VectorTest.restype = ct.c_ulonglong * 32 

# set the return type to 64bit unsigned 
# integer array with 32 elements (this is just for debugging atm.)

vec = VectorTest() # call the c++ function, vec should now contain the returned memory

for i in range(0, 32): # print all the values
    print(vec[i])

print('diff1', vec[3] - vec[0]) # this value never changes

print('diff2', vec[15] - vec[4]) # this value never changes

现在我只是转储返回的内存以试图找到begin()和end()指针,因为从技术上讲,这些只是我查找数组值所需的全部内容。

这是一个输出示例:

754548928240
2850274634992
0
754548928400
1545446976
0
0
140731499719200
0
165212429600621
0
0
0
0
0
1545365980
2850237907016
2850274763904
2850273274168
0
751619281153
0
2850273493592
0
2847563317248
0
2850273493592
140731499719200
2850273274168
754548929040
0
2850238680016
diff1 160
diff2 -80996

底部的diff值都与矢量大小无关,因此第一个和第四个元素不能是开始和结束指针。我还尝试取消引用并打印位于内存位置的值,但是找不到值1,2,3。

我要问的是:

  • std :: vector如何存储在内存中?

  • 有没有更好的解决方法,不需要修改 c ++ dll?

1 个答案:

答案 0 :(得分:0)

YiFei建议创建另一个包含向量相关函数的C ++ dll,然后将python脚本绑定到该dll。我会继续这样做,所以我认为这是问题的解决方案。感谢所有参与者!

编辑:此解决方案已实施并且运行良好。