2

入力として既知のサイズの配列へのポインターを受け入れ、関数がデータの処理を完了するまで決定できないサイズの配列を返す c++ 関数があります。c++ 関数を呼び出して最初の配列を渡し、結果を 2 番目の配列として受け取るにはどうすればよいですか?

私は現在、これに似たようなことをしています:

パイソン:

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 で埋められます。返された配列が大きい場合、配列要素がいっぱいになると結果が切り捨てられます。

それが役立つ場合、返された配列の構造には、返された配列のサイズが最初の要素として含まれます。

事前に助けてくれてありがとう...

4

2 に答える 2

2

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
于 2013-04-16T05:10:47.663 に答える