2012-07-18 27 views
0

我想要做的是將C函數轉換爲python函數。如何在調用函數時返回ctyps中的數組

例如,我有一個C函數原型其中預先定義:

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

上述功能的輸入是Arraysize,這是在readingArray參數元素的數量。

上述功能的輸出爲readingArray[]ArraysizereadingArray[]返回結果數組,Actual_arraysize指示返回數組的實際大小。

而下面是Python的功能我寫了使用此C函數原型:

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值更改成功。但撥打c function prototypereadingarray的值沒有變化。

如何處理這種情況,是因爲我不應該使用byref

回答

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 
+0

我不知道是什麼問題,但是在我嘗試了你的方法之後,'_c_readingarray'的值仍然不會改變。 – 2342G456DI8 2012-07-18 07:52:55

+0

你確定c函數改變了readingArray的內容嗎?我添加了測試c代碼。請將c代碼編譯到test.dll中,並嘗試使用我的python代碼。 – HYRY 2012-07-18 08:24:32

+0

非常感謝,終於找出問題所在。這是'dll'的問題,而不是python的實現,但是你教給我的東西對我來說非常有用。 – 2342G456DI8 2012-07-18 09:45:50

相關問題