2010-11-10 13 views
33

Se ho i 2 insiemi di codice seguenti, come posso incollarli insieme?Come si converte una lista Python in un array C usando i ctypes?

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) 

Come posso chiamare la funzione c con un elenco contiguo di elementi in x? Ho provato a trasmettere x a un c_void_p, ma non ha funzionato.

Ho anche cercato di usare qualcosa come

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

ma questo diventa un errore di sintassi.

Il codice C desidera chiaramente l'indirizzo di un array. Come faccio a ottenere questo?

risposta

61

Il seguente codice funziona sulle liste arbitrarie:

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

" * pyarr "in python ... Che cosa significa? – AaronYC

+4

@AaronYC Mi dispiace per la confusione; 'pyarr' è una normale lista di python, come' pyar = [1,2,3,4] '. Se ti stai chiedendo la stella prima del nome, guarda questo: http://stackoverflow.com/questions/400739/what-does-mean-in-python –

+1

Grazie mille ... Il link che hai dato è quello di cui avevo bisogno ... – AaronYC

8

Da the ctypes tutorial:

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

Tentare di creare array di più che con 255 articoli. –

+2

Funziona con più di 255 elementi: 'IntArray300 = c_int * 300; arrayWith300Elements = IntArray300 (* elenco ([i per i in intervallo (300)])) ' –

Problemi correlati