结构指针传递把ctypes的函数
it1352
帮助1人
问题说明
我试图在ctypes中重做Misaka模块,但是当我尝试使用bufputs时,我得到一个错误(请参阅第二代码示例的结尾)。当我将指针传递给函数时,我使用 pointer(b)
。那不起作用, byref(b)
也不起作用。
I'm trying to redo the Misaka module in ctypes, but when I try to use bufputs I get an error (see end of 2nd code sample). When I pass the pointer to the function I use pointer(b)
. That doesn't work and byref(b)
doesn't work either.
这是函数签名:
/* 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
我不知道自己做错了什么。
I can't figure out what I did wrong.
正确答案
#1
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')
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /reply/detail/tanhcfkeha
系列文章
更多
同类精品
更多
-
YouTube API 不能在 iOS (iPhone/iPad) 工作,但在桌面浏览器工作正常?
it1352 07-30 -
iPhone,一张图像叠加到另一张图像上以创建要保存的新图像?(水印)
it1352 07-17 -
保持在后台运行的 iPhone 应用程序完全可操作
it1352 07-25 -
使用 iPhone 进行移动设备管理
it1352 07-23 -
在android同时打开手电筒和前置摄像头
it1352 09-28 -
扫描 NFC 标签时是否可以启动应用程序?
it1352 08-02 -
检查邮件是否发送成功
it1352 07-25 -
Android微调工具-删除当前选择
it1352 06-20 -
希伯来语的空格句子标记化错误
it1352 06-22 -
Android App 和三星 Galaxy S4 不兼容
it1352 07-20