0

我想做的是将C函数转换为python函数。

例如,我有一个预定义的 C 函数原型:

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

上述函数的输入为,即参数Arraysize中的元素个数。readingArray

上述函数的输出是readingArray[]ArraysizereadingArray[]返回结果的数组,并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 函数中返回数组和实际大小。

这是我的代码:

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 回答