我想要做的是将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
?
答案 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