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]
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]
Đố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)
đâ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
Tôi đã thử (cbytes.c_ubyte * 256)() – mete