2010-11-10 84 views
33

如果我有以下兩組代碼,我該如何將它們粘合在一起?如何使用ctypes將Python列表轉換爲C數組?

void 
c_function(void *ptr) { 
    int i; 

    for (i = 0; i < 10; i++) { 
     printf("%p", ptr[i]); 
    } 

    return; 
} 


def python_routine(y): 
    x = [] 
    for e in y: 
     x.append(e) 

我怎樣才能調用與x中的元素連續列表的c_function?我試圖將x轉換爲c_void_p,但那不起作用。

我也嘗試過使用類似

x = c_void_p * 10 
for e in y: 
    x[i] = e 

但得到一個語法錯誤。

C代碼顯然需要數組的地址。我如何得到這個發生?

回答

61

下面的代碼適用於任意列表:

import ctypes 
pyarr = [1, 2, 3, 4] 
arr = (ctypes.c_int * len(pyarr))(*pyarr) 
+0

「* pyarr」in python ...這是什麼意思? – AaronYC 2012-12-21 08:34:56

+4

@AaronYC我很抱歉的混淆; 'pyarr'是一個普通的python列表,比如'pyar = [1,2,3,4]'。如果你想知道名稱之前的明星,請檢查:http://stackoverflow.com/questions/400739/what-does-mean-in-python – 2012-12-22 05:07:03

+1

非常感謝...你給的鏈接是我需要什麼...... – AaronYC 2012-12-24 03:17:49

8

the ctypes tutorial

>>> IntArray5 = c_int * 5 
>>> ia = IntArray5(5, 1, 7, 33, 99) 
+0

嘗試超過255項創建陣列。 – 2015-06-19 13:14:50

+2

適用於超過255項:'IntArray300 = c_int * 300; arrayWith300Elements = IntArray300(* list([i for i in range(300)]))' – 2016-12-20 10:33:19

相關問題