2016-04-07 17 views
2

Bu, Ctypes'i ilk kez kullanma girişimim. İçeriğine 1 ekleme basit bir arabellek manipülasyon yapan bir Cll var. Python'da sarılı C kitaplığı, ancak döndürülen dizi değişmedi

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; 
    } 
} 

Ve piton kodunda

Ben

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] 

alıyorum sonuç 42'dir ancak verilerin içeriği değişmeden kalır var. Baktım ama hala sebebini bulamıyorum.

+0

'Verilerin kendisinin değiştirilmesinden çok' data_array (* data) 'sonucunu değiştirdiğiniz anlaşılıyor. 'Data_array' içeriği değişiyor mu? – spiffman

+0

@spiffman bu sorun, ancak 'data_array' türünde değil, bu türün bir örneği de. – Flexo

cevap

1

Bu kod:

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

data_array adında bir ctypes dizi türünde bir örnek de, data anonim kopyasını oluşturur.

data_array örneğini geçirdiğinizde, anonim olarak değiştirilmiş olan yeni kopyanın işlevini anonim olarak oluşturun.

Bunun yerine gerekir: işlevine geçirilen aynı diziyi yazdırır ve içinde geçmesi dizi yerine anonim ait adlandırılır emin olur

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] 

.

+0

Merhaba, teşekkürler, buradaki anlayışım, data_array'ın, veri içeriğiyle doldurulan tam olarak 9 baytlık bir şekilde ayrılmış bellek olduğu yönündedir. Ama ben basılı data_array'i denediğimde, onun tekrarlanamaz olduğunu buldum. Yani burada arg ile data_array arasındaki fark nedir? – damtheman

+0

'data_array'' uint8 [9] 'türünde bir python temsilidir. Bu, bir sınıfın ve sınıfın bir örneği ile klişe olmayan normal bir pythondaki farkla aynıdır. 'arg', örneğimde' data' öğesini kopyaladığınız türde bir örnektir. – Flexo