2
我試圖重做ctypes中的Misaka模塊,但是當我嘗試使用bufputs時,出現錯誤(請參閱第2代碼示例的結尾)。當我將指針傳遞給函數時,我使用pointer(b)
。這不起作用,並且byref(b)
也不起作用。將結構指針傳遞給ctypes中的函數
這是函數簽名:
/* bufputs • appends a NUL-terminated string to a buffer */
void
bufputs(struct buf *, const char*);
這是我的代碼:
>>> from ctypes import *
>>> sundown = cdll.LoadLibrary('./libsundown.so.1')
>>> sundown
<CDLL './libsundown.so.1', handle 1e2f190 at 1bea0d0>
>>> # OUT: <CDLL './libsundown.so.1', handle 2840d80 at 2797290>
>>> class buf(Structure):
... _fields_ = [
... ('data', c_char_p),
... ('size', c_size_t),
... ('asize', c_size_t),
... ('unit', c_size_t),
... ('ref', c_int)]
...
>>> sundown.bufnew.argtypes = [c_size_t]
>>> sundown.bufnew.restype = buf
>>> b = sundown.bufnew(c_size_t(1024))
>>> sundown.bufputs.argtypes = [POINTER(buf), c_char_p]
>>> s = c_char_p('this is a test')
>>> sundown.bufputs(pointer(b), s)
python2: malloc.c:3574: mremap_chunk: Assertion `((size + offset) & (mp_.pagesize-1)) == 0' failed.
Aborted
我想不出我做錯了什麼。
我不熟悉您正在使用的庫,但指針創建BUF類(例如解決)的實例? – octopusgrabbus
如果你找到答案,你應該回答並接受你自己的問題。 :) – Robin
只需將解決方案作爲答案發布並接受它。否則我會偷走它。輕鬆的代表。 :d – ApprenticeHacker