Python ctypes:具有位字段初始化的结构

2024-04-26 23:22:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我注意到我不能默认初始化ctypes.结构派生类,但我可以默认初始化此类对象的数组。在

假设我们定义了这样一个类:

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)

现在这段代码执行得很顺利,据我所知,它使用了上面定义的默认构造函数。在

^{pr2}$

返回零填充结构的数组。但是,当我试图初始化一个对象时,我得到一个“访问冲突读取位置”错误,程序崩溃。在

w = What()

如果有人能解释下引擎盖下发生了什么,以及这种行为的原因,那就太好了。在

更多细节:

我需要

x = ctypes.c_float()
y = ctypes.c_short()

不是直接将0传递给初始化,因为结构的字段通常包含其他结构,我也希望在这里使用它们的默认构造函数(这样所有的东西都用0递归初始化)。在

我相信这对于那些想先用虚拟值测试包装好的包的人是有用的。在


Tags: 对象selfnoneif定义initnot数组
1条回答
网友
1楼 · 发布于 2024-04-26 23:22:26

基类不知道x和{}是什么。如果我正确地理解了操作,ctypes.Structure的默认行为就是所需的全部内容。我添加了一个__repr__函数,以便更容易地查看发生了什么:

class What(ctypes.Structure):
    _fields_ = [('x', ctypes.c_float), ('y', ctypes.c_short, 2)]

    def __repr__(self):
        return f'What(x={self.x},y={self.y})'

正在测试。。。在

^{pr2}$

另外请注意,ctypes结构在默认情况下是零初始化的,因此即使对于嵌套结构也不需要任何魔术:

import ctypes

class Inner(ctypes.Structure):
    _fields_ = [('a',ctypes.c_int),('b',ctypes.c_int)]

    def __repr__(self):
        return f'Inner(a={self.a},b={self.b})'

class What(ctypes.Structure):
    _fields_ = [('x', Inner), ('y', ctypes.c_short, 2)]

    def __repr__(self):
        return f'What(x={self.x},y={self.y})'

正在测试。。。在

>>> w = What()
>>> w
What(x=Inner(a=0,b=0),y=0)
>>> wa = (What*4)()
>>> list(wa)
[What(x=Inner(a=0,b=0),y=0), What(x=Inner(a=0,b=0),y=0), What(x=Inner(a=0,b=0),y=0), What(x=Inner(a=0,b=0),y=0)]

相关问题 更多 >