webentwicklung-frage-antwort-db.com.de

Wie konvertiere ich eine Python-Liste mit ctypes in ein C-Array?

Wenn ich die folgenden 2 Codesätze habe, wie klebe ich sie zusammen?

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)

Wie kann ich c_function mit einer zusammenhängenden Liste von Elementen in x aufrufen? Ich habe versucht, x in ein c_void_p umzuwandeln, aber das hat nicht funktioniert. 

Ich habe auch versucht, so etwas zu verwenden 

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

dies führt jedoch zu einem Syntaxfehler. 

Der C-Code will eindeutig die Adresse eines Arrays. Wie bekomme ich das?

37

Der folgende Code funktioniert für beliebige Listen:

import ctypes
pyarr = [1, 2, 3, 4]
arr = (ctypes.c_int * len(pyarr))(*pyarr)
67
Gabi Purcaru

Aus das ctypes Tutorial :

>>> IntArray5 = c_int * 5
>>> ia = IntArray5(5, 1, 7, 33, 99)
8
Ryan Ginstrom

Dies ist eine Erklärung der akzeptierten Antwort.

ctypes.c_int * len(pyarr) erstellt ein Array (Sequenz) vom Typ c_int der Länge 4 ( python3 , python 2 ). Da c_int ein Objekt ist, dessen Konstruktor ein Argument benötigt, führt (ctypes.c_int * len(pyarr)(*pyarr) eine Einzelimitierung jeder c_int-Instanz aus pyarr aus. Ein einfacher zu lesen Formular ist:

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

Verwenden Sie die Funktion type, um den Unterschied zwischen seq und arr anzuzeigen.

6
akhan
import ctypes
import typing

def foo(aqs : typing.List[int]) -> ctypes.Array:
    array_type = ctypes.c_int64 * len(aqs)
    ans = array_type(*aqs)
    return ans

for el in foo([1,2,3]):
    print(el)

das wird geben:

1
2
3
0
Jörg Beyer