2014-01-22 85 views
1

我想使用ctypes的蟒蛇移動值的列表下的列表,我的計劃是第一個指針傳遞到列表中,在C改造它。移動從蟒蛇到C

因此,在蟒蛇:

test = [1,2,3] 
Circuit.cCore.Add_Interpolation.argtype = [ctypes.c_int, 
              ctypes.POINTER(ctypes.c_double)] 
i = ctypes.c_double(test[0]) 
pi = ctypes.pointer(i) 
self.cCoreID = Circuit.cCore.Add_Interpolation(machine.cCoreID, ctypes.byref(pi)) 

然後在C:

int Add_Interpolation(int owner, double* pointer) 
{ 
    printf("%d \n", *pointer); 
} 

我不斷收到40075424出來,任何想法,爲什麼?

我也開放其他方式來做到這一點。

回答

2

無法打印double這種方式; %d僅適用於整數。您需要使用floating point conversion specifiers之一,如%f

printf("%f\n",*pointer); 

您應該考慮提高編譯器的警告級別。許多現代編譯器可以對此提出警告。

2

正確的屬性名稱是argtypesargtype

一個CPython的列表的元素是PyObject *,各定點處的任意地址分配(只要你關心)的對象。至少該對象有一個引用計數和指向該類型的指針。對於一個Python float此之後由C double價值,併爲2.X int它的C long值。

你是不是傳遞一個「第一指針列表」,這是沒有意義的。 pi是一個指向新創建的緩衝區的轉換後的雙倍值test[0]。我也不知道你爲什麼通過這個指針byref。 ctypes的應該有拋出異常:

ctypes.ArgumentError: argument 2: <type 'exceptions.TypeError'>: 
expected LP_c_double instance instead of pointer to LP_c_double 

,這是沒有,不過是因爲你設置argtype不是正確的屬性名稱argtypes的。所以沒有類型檢查。

要將一個數字列表傳遞給C函數,您需要ctypes將對象轉換爲連續數組中所需的C類型,如double。使用*運算符爲序列重複創建陣列類型,例如c_double * 10長度爲10的陣列。

Circuit.cCore.Add_Interpolation.argtypes = [ctypes.c_int, 
              ctypes.POINTER(ctypes.c_double)] 

test = [1,2,3] 
test_arr = (ctypes.c_double * len(test))(*test) 

self.cCoreID = Circuit.cCore.Add_Interpolation(machine.cCoreID, 
               test_arr) 

C:

int Add_Interpolation(int owner, double *pointer) 
{ 
    printf("%f\n", *pointer); /* print first double */ 
} 

您需要包括陣列的長度作爲參數,如果它不是一個已知的大小。

+0

感謝啊,雖然我得到的錯誤 'test_arr =(ctypes.c_float * LEN(試驗))(*測試)'' 類型錯誤:浮子required' 即使我改變了一切上浮 –

+0

其確定我設法解決這個問題,因爲我正在讀取一個文件,它將它存儲爲一個字符串列表。 –