Passer un pointeur de structure à une fonction dans ctypes

J’essaie de refaire le module Misaka dans les ctypes, mais lorsque j’essaie d’utiliser des correctifs, j’obtiens une erreur (voir la fin du deuxième exemple de code). Lorsque je passe le pointeur à la fonction, j’utilise le pointer(b) . Cela ne fonctionne pas et byref(b) ne fonctionne pas non plus.

Ceci est la signature de la fonction:

 /* bufputs • appends a NUL-terminated ssortingng to a buffer */ void bufputs(struct buf *, const char*); 

Ceci est mon code:

 >>> from ctypes import * >>> sundown = cdll.LoadLibrary('./libsundown.so.1') >>> sundown  >>> # OUT:  >>> 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 

Je ne peux pas comprendre ce que j’ai mal fait.

La solution du PO, initialement publiée dans la question

 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')