2010-11-10 5 views
33

Jeśli mam następujące 2 zestawy kodu, w jaki sposób mogę je skleić?Jak przekonwertować listę w Pythonie do tablicy C za pomocą 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) 

Jak mogę wywołać funkcję c_ z ciągłą listą elementów wx? Próbowałem rzucić x na c_void_p, ale to nie zadziałało.

Próbowałem też użyć czegoś jak

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

ale ten dostaje błąd składni.

Kod C wyraźnie chce adresu tablicy. Jak mogę to osiągnąć?

Odpowiedz

61

Poniższy kod działa na dowolnych list:

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

" * pyarr "w python ... Co to znaczy? – AaronYC

+4

@AaronYC Przepraszam za zamieszanie; 'pyarr' to zwykła lista pythonów, np.' pyar = [1,2,3,4] '. Jeśli zastanawiasz się nad gwiazdą przed nazwą, sprawdź to: http://stackoverflow.com/questions/400739/what-does-mean-in-python –

+1

Bardzo dziękuję ... Podany link czego potrzebowałem ... – AaronYC

8

Od the ctypes tutorial:

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

spróbować stworzyć tablice z ponad 255 elementów. –

+2

Działa z więcej niż 255 pozycji: 'IntArray300 = c_int * 300; arrayWith300Elements = IntArray300 (* lista ([i dla i w zakresie (300)])) ' –

Powiązane problemy