c++函数返回未知大小的数组

ctypes c++ function returns array of unknown size

本文关键字:数组 未知 函数 返回 c++      更新时间:2023-10-16

我有一个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,因此例如您可以使用CoTaskMemAllocCoTaskMemFree。接口的两边都可以调用这些函数。

另一种选择是将分配和回收保持在一起。调用方必须持有被调用方返回的指针。当它用完缓冲区后,通常在将其复制到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