【发布时间】:2018-06-15 17:09:09
【问题描述】:
我注意到当 ctypes.Structure 派生类的对象中有位字段时,我无法默认初始化它,但我可以默认初始化此类对象的数组。
假设我们定义了这样一个类:
class What(ctypes.Structure):
_fields_ = [('x', ctypes.c_float), ('y', ctypes.c_short, 2)]
def __init__(self, x=None, y=None):
if not x:
x = ctypes.c_float()
if not y:
y = ctypes.c_short()
super(What, self).__init__(x, y)
现在这段代码可以顺利执行,据我了解,它使用了上面定义的默认构造函数。
what_arr = What * 4
w_arr = what_arr()
返回一个由零填充的结构组成的数组。但是,当我尝试仅初始化一个对象时,我收到“访问冲突读取位置”错误并且程序崩溃。
w = What()
如果有人能解释幕后发生的事情以及这种行为的原因是什么,那就太好了。
更多细节:
我需要
x = ctypes.c_float()
y = ctypes.c_short()
而不是直接将 0 传递给初始化,因为通常结构的字段包含其他结构,我也想在这里使用它们的默认构造函数(这样所有东西都用 0 递归初始化)。
我相信这对于想要首先测试一些带有虚拟值的包装包的人可能很有用。
【问题讨论】:
标签: python structure ctypes bit-fields