如何在调用函数时在ctyps中返回数组

时间:2012-07-18 03:41:56

标签: python c arrays pointers ctypes

我想要做的是将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的值已成功更改。但是在调用readingarrayc function prototype的值没有改变。

如何处理这种情况,是因为我不应该使用byref

1 个答案:

答案 0 :(得分:1)

是的,传递数组时不需要byref。并使用list作为默认参数值将导致意外错误。您可以在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