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?
Der folgende Code funktioniert für beliebige Listen:
import ctypes
pyarr = [1, 2, 3, 4]
arr = (ctypes.c_int * len(pyarr))(*pyarr)
Aus das ctypes Tutorial :
>>> IntArray5 = c_int * 5
>>> ia = IntArray5(5, 1, 7, 33, 99)
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.
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