2012-02-04 21 views
5

là gì cách chính xác (Tôi nhận seg.fault) để gửi một bộ đệm uint8 để một hàm C định nghĩa là:ctypes python uint8 đệm sử dụng

void f(uint8* p, size_t len) 

_lib.f.argtypes=[ctypes.POINTER(ctypes.c_ubyte), ctypes.c_uint] 
+0

đâu là dữ liệu bạn đang thực sự cố gắng để gửi? Nó có ích để xem những gì bạn đã cố gắng cho đến nay. – jsbueno

+0

Tôi đã thử (cbytes.c_ubyte * 256)() – mete

Trả lời

2

Đối tượng mảng được tạo ra bởi cách bạn đặt vào nhận xét của bạn - (cbytes.c_ubyte * 256)() đều ổn. Nhưng trong ctypes "biệt ngữ" đối tượng này không tương đương với ctypes.POINTER (ctypes.c_ubyte) - ctypes nên cảnh báo bạn khi bạn cố gọi hàm bằng mảng làm tham số.

Dù sao, có lẽ khi bạn truyền mảng được tạo làm tham số, ctypes không chuyển tham chiếu đến nội dung của nó, nhưng một số khác tới C (có thể là địa chỉ của đối tượng Python, không phải nội dung của nó).

Nếu bạn cast một con trỏ đến các nội dung của mảng của bạn để loại POINTER bạn tạo ra, nó có thể sẽ làm việc:

pointer_type = ctypes.POINTER(ctypes.c_ubyte) 
_lib.f.argtypes=[pointer_type), ctypes.c_uint] 
data_block = (ctypes.c_ubyte * 256)() 
pointer = ctypes.cast(ctypes.addressof(data_block, pointer_type)) 
_lib.f(pointer, 256) 
+0

Tôi sẽ thử điều này. có cách nào khác để tạo các bộ đệm khác với các mảng ctypes không? – mete

+0

Tôi nhận ra seg.fault là do cái gì khác. Bây giờ tôi trực tiếp gửi bộ đệm làm tham số, và không có vấn đề gì. – mete

Các vấn đề liên quan