Какъв е правилният начин (аз получавам seg.fault), за да изпратите uint8
буфер към C функция, дефинирана като:
void f(uint8* p, size_t len)
_lib.f.argtypes=[ctypes.POINTER(ctypes.c_ubyte), ctypes.c_uint]
Отговори:
2 за отговор № 1Масивите обекти, създадени по начина, по който поставяте коментара си - (cbytes.c_ubyte * 256)()
са добре. Но в ctypes "jargon" този обект не е еквивалентен на ctypes.POINTER (ctypes.c_ubyte) - ctypes трябва да ви предупреди, когато се опитате да извикате функцията с масива като параметър.
Както и да е, вероятно, когато преминете създадения масивкато параметър, ctypes не препраща към неговото съдържание, а на друго нещо към C (може би адреса на Python обекта, а не на неговото съдържание).
Ако насочите указател към съдържанието на масива към типа на POINTER, който сте създали, вероятно ще работи:
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)