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

标签 c++ python arrays ctypes

我有一个 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。接口(interface)双方都可以调用这些函数。

另一种方法是将分配和释放放在一起。调用者必须保留被调用者返回的指针。当它完成缓冲区的使用时,通常是在将其复制到 Python 结构中之后,它会要求库释放内存。

关于c++ - ctypes C++ 函数返回未知大小的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16023614/

相关文章:

c++ - 将两个缓冲区合并为 Win32 管道上的单个写入

c++ - 全局范围内的对象在程序退出时导致崩溃

python - 在特定条件下从列表(或其他可迭代)中获取项目数

python - 根据另一列中的值复制 PySpark Dataframe 中的行并获得顺序

c++ - 在 C++ 中为数组分配特定数量的内存的目的是什么?

c++ - Windows Metro 模式 (C++) : Waiting on semaphore (WaitForSingleObjectEx): failed with Access Denied [partially solved]

c++ - Aligned_alloc 行为

python - Django:使用过滤器随机查询一条记录的最快方法

javascript - 使用 PHP 将 JSON 附加到文件中的数组

java - JNA 的 Pointer.getPointerArray(long base) 和 Pointer.getStringArray(long base) 中的 'base' 是什么意思?