2016-04-07 14 views
2

Dies ist mein erster Versuch mit Ctypes zu verwenden. Ich habe eine C-DLL, die eine einfache Puffermanipulation durchführt, um 1 zu ihrem Inhalt hinzuzufügen.Wrapped C-Bibliothek in Python, aber zurückgegebene Array ist unverändert

extern "C" 
{ 
    __declspec(dllexport) int AddBuffer(unsigned char* data, unsigned char len) 
    { 
     int i = 0; 
     int sum = 0; 
     for (i = 0; i < len; i++) 
     { 
      sum = sum + data[i]; 
      data[i] = data[i] + 1; 
     } 

     return sum; 
    } 
} 

Und in meinem Python-Code habe ich

data = [1,2,3,4,5,8,4,6,9] 
myfunc = test_dll.AddBuffer 
myfunc.argtypes = (ctypes.POINTER(ctypes.c_uint8),ctypes.c_uint8) 
data_array = ctypes.c_uint8 * len(data) 
result = myfunc(data_array(*data),ctypes.c_uint8(len(data))) 
print result 
for i in range (0,len(data)): 
    print data[i] 

Das Ergebnis bekomme ich 42, aber der Inhalt der Daten bleiben unverändert. Ich habe gesucht, kann aber immer noch nicht den Grund finden.

+0

Sieht so aus, als ob Sie das Ergebnis von 'data_array (* data)' modifizieren, anstatt "data" selbst zu modifizieren. Ändert sich der Inhalt von 'data_array'? – spiffman

+0

@spiffman das ist das Problem, aber 'data_array' ist ein Typ, keine Instanz dieses Typs. – Flexo

Antwort

1

Dieser Code:

data_array = ctypes.c_uint8 * len(data) 
result = myfunc(data_array(*data),ctypes.c_uint8(len(data))) 

Erzeugt eine anonyme Kopie data, in einer Instanz eines ctypes Array-Typs data_array genannt.

Wenn Sie die data_array Instanz übergeben, erstellen Sie anonym zu Ihrer Funktion, was geändert wird, die neue Kopie.

Stattdessen benötigen Sie:

data = [1,2,3,4,5,8,4,6,9] 
myfunc = test_dll.AddBuffer 
myfunc.argtypes = (ctypes.POINTER(ctypes.c_uint8),ctypes.c_uint8) 
data_array = ctypes.c_uint8 * len(data) 
arg = data_array(*data) 
result = myfunc(arg,ctypes.sizeof(arg)) 
print result 
for i in range (0,len(arg)): 
    print arg[i] 

, die die gleiche Anordnung in der Funktion übergeben druckt und stellt sicher, dass das Array, das Sie in geben statt anonymer gestattet.

+0

Hallo danke, das hat funktioniert, mein Verständnis hier ist, dass data_array ist ein bestimmter Speicher mit genau 9 Bytes, die mit den Inhalten der Daten gefüllt ist. Aber als ich print data_array ausprobierte, fand ich heraus, dass es nicht iterierbar ist. Also hier ist der Unterschied zwischen arg und data_array hier – damtheman

+0

'data_array' ist eine Python-Darstellung des Typs' uint8 [9] '. Es ist der gleiche wie der Unterschied zwischen einer Klasse und einer Instanz einer Klasse in regulärem Python ohne Ctypes. 'arg' ist eine Instanz dieses Typs, in die Sie' data' in meinem Beispiel kopieren – Flexo

Verwandte Themen