簡體   English   中英

ctypes c ++函數返回未知大小的數組

[英]ctypes c++ function returns array of unknown size

我有一個c ++函數,它接受指向已知大小的數組的Pointer作為輸入,並返回一個直到該函數完成其數據處理才能確定的大小的數組。 如何調用c ++函數,傳遞第一個數組並將結果作為第二個數組接收?

我目前正在執行類似的操作:

蟒蛇:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM