2011-08-19 182 views
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 

我想不出我做錯了什麼。

+0

我不熟悉您正在使用的庫,但指針創建BUF類(例如解決)的實例? – octopusgrabbus

+0

如果你找到答案,你應該回答並接受你自己的問題。 :) – Robin

+0

只需將解決方案作爲答案發布並接受它。否則我會偷走它。輕鬆的代表。 :d – ApprenticeHacker

回答

2

的OP的解決方案,最初發布在問題

class buf(Structure): 
    _fields_ = [ 
     ('data', c_char_p), 
     ('size', c_size_t), 
     ('asize', c_size_t), 
     ('unit', c_size_t), 
     ('ref', c_int) 
    ] 
buf_p = POINTER(buf) 

sundown.bufnew.argtypes = [c_size_t] 
sundown.bufnew.restype = buf_p 
sundown.bufgrow.argtypes = [buf_p, c_size_t] 
sundown.bufputs.argtypes = [buf_p, c_char_p] 

ib = buf() 

# ctypes does this internally: 
# memset(byref(ib), 0x0, sizeof(buf)) 

text = 'this is some text' 
ib.data = text 
ib.size = len(text) 

ob = sundown.bufnew(128) 
sundown.bufgrow(ob, int(math.ceil(ib.size * 1.4))) 

sundown.bufputs(ob, 'test')