c++函数返回未知大小的数组
ctypes c++ function returns array of unknown size
我有一个c++函数,它接受一个指向已知大小的数组的指针作为输入,并返回一个数组的大小,该数组的大小在函数完成数据处理之前无法确定。我如何调用c++函数,传递第一个数组并接收结果作为第二个数组?
我现在做了类似的事情:
PYTHON:def callout(largeListUlonglongs):
cFunc = PyDLL("./cFunction.dll").processNumbers
arrayOfNums = c_ulonglong * len(largeListUlonglongs)
numsArray = arrayOfNums()
for x in xrange(len(largeListUlonglongs)):
numsArray[x] = long(largeListUlonglongs[x])
cFunc.restype = POINTER(c_ulonglong * len(largeListUlonglongs))
returnArray = cFunc(byref(numsArray)).contents
return returnArray
只要returnArray与numsArray的大小相同,这就可以工作。如果它更小,那么数组的空元素将被0填充。如果返回的数组比结果大,一旦数组元素被填充,就会被截断。
如果有帮助的话,返回数组的结构包含返回数组的大小作为其第一个元素。
通常最好是让调用者分配缓冲区。这样调用者也可以释放它。然而,在这种情况下,只有被调用方知道缓冲区需要多长。因此,责任传递给被调用方来分配缓冲区。
但是这对系统施加了额外的约束。由于被调用方正在分配缓冲区,所以除非它们共享相同的分配器,否则调用方无法释放缓冲区。这其实不需要太多麻烦就能安排好。您可以使用共享分配器。有一些。您的平台似乎是Windows,因此例如您可以使用CoTaskMemAlloc
和CoTaskMemFree
。接口的两边都可以调用这些函数。
另一种选择是将分配和回收保持在一起。调用方必须持有被调用方返回的指针。当它用完缓冲区后,通常在将其复制到Python结构中之后,它要求库释放内存。
David就内存管理问题给了您有用的建议。我通常会使用更简单的策略,即在库中使用一个函数来释放分配的缓冲区。调用方有责任防止内存泄漏。
对我来说,你的问题似乎只是关于将结果转换为正确的指针类型。因为在索引0中有长度,所以可以将结果类型设置为long long
指针。然后获取大小,以便将结果强制转换为正确的指针类型。
def callout(largeListUlonglongs):
cFunc = PyDLL("./cFunction.dll").processNumbers
cFunc.restype = POINTER(c_ulonglong)
arrayOfNums = c_ulonglong * len(largeListUlonglongs)
numsArray = arrayOfNums(*largeListUlonglongs)
result = cFunc(numsArray)
size = result[0]
returnArray = cast(result, POINTER(c_ulonglong * size))[0]
return returnArray
相关文章:
- C++未知长度字符串的数组,其行为类似于 Python 字符串列表
- C++中数组大小未知的指针转换
- 如何定义在编译时数据未知的 const 数组
- 在C++中初始化第一维大小未知的二维数组
- 在带有模板的函数中传递未知大小的 std::数组.如何更正此代码?
- 你能让数组中的项数未知吗
- 当数组大小在C++中未知时,如何在运行时将对字符串数组的引用作为函数参数传递?
- 如何将输入到具有未知数量元素的数组中?
- 获取由空格分隔的未知大小的单行输入,并将其存储到整数数组中
- 使用 ReadProcessMemory() 将未知大小的字符数组或字符串读入 wstring 中
- 未知容器、向量或数组 c++ 的大小
- 未知大小的数组作为类成员,用于在运行时(对象创建时间)创建数组的对象
- 构造函数初始化器列表中未知长度的数组
- 在 c++ 中使用未知元素初始化的字符数组
- 特征:将数组映射到矩阵大小未知的矩阵
- 如何声明一个未知大小的数组,然后输入直到我想要,然后获取数组的大小
- 如何在 C++ 中将值附加到未知大小的数组中
- 如何确定未知类型数组的索引是否为空
- 使用数组和布尔值在输出未知时从输出中删除逗号
- 如何正确写入多维字符数组未知数量的值,但固定的字符堆