0

私がやりたいことは、C関数をPython関数に変換することです。

たとえば、事前定義された C 関数プロトタイプがあります。

function_test(ViInt32 Arraysize, ViReal64 readingArray[], ViInt32 *Actual_rraysize)

上記の関数の入力は で、これはパラメーターArraysizeの要素数です。readingArray

上記の関数の出力はreadingArray[]Arraysizeです。readingArray[]結果の配列を返し、返された配列のActual_arraysize実際のサイズを示します。

以下は、この C 関数プロトタイプを使用して作成した Python 関数です。

from ctypes import *
def Py_function_test(self, arraysize, readingarray = [], actualarraysize = [-1e-10]):
    while len(readingarray) < arraysize:
        readingarray.append(0)
    _c_actualarraysize = c_int()
    ArrayOfDouble = c_double * arraysize
    _c_readingarray = ArrayOfDouble()
    self.function_test(c_int(arraysize), 
                       byref(_c_readingarray), 
                       byref(_actualarraysize))
    for n in range(arraysize):
        readingarray[n] = _c_readingarray[n]
    actualarraysize[0] = _c_actualarraysize.value

最終的に、 の値acutalarraysizeが正常に変更されたことがわかりました。しかし、readingarrayを呼び出した後、 の値は変わりませんでしたc function prototype

この状況にどう対処するか、それは を使用すべきではなかったからbyrefですか?

4

1 に答える 1

1

はい、配列を渡すときに byref は必要ありません。また、リストをデフォルトの引数値として使用すると、予期しないバグが発生します。Python 関数で配列と actualarrysize を返すことができます。

これが私のコードです:

from ctypes import *
test = cdll.LoadLibrary("test")
test.function_test.argtypes = [
    c_int, POINTER(c_double), POINTER(c_int)
]

def Py_function_test(arraysize):
    _c_readingarray = (c_double*arraysize)()
    _c_actualarraysize = c_int()
    test.function_test(arraysize, _c_readingarray, byref(_c_actualarraysize))
    return _c_readingarray, _c_actualarraysize.value

array, size = Py_function_test(10)
print list(array), size

Cコード:

void function_test(int Arraysize, double readingArray[], int *Actual_rraysize)
{
    int i;
    *Actual_rraysize = Arraysize/2;
    for(i=0;i<*Actual_rraysize;i++)
        readingArray[i] = i;
}

Pythonコードの出力は次のとおりです。

[0.0, 1.0, 2.0, 3.0, 4.0, 0.0, 0.0, 0.0, 0.0, 0.0] 5
于 2012-07-18T06:31:32.740 に答える