我有一个 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
。接口(interface)双方都可以调用这些函数。
另一种方法是将分配和释放放在一起。调用者必须保留被调用者返回的指针。当它完成缓冲区的使用时,通常是在将其复制到 Python 结构中之后,它会要求库释放内存。
关于c++ - ctypes C++ 函数返回未知大小的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16023614/