Wipy平台MicroPython实现C++嵌套结构体,变量访问失败求解决方案
解决MicroPython中嵌套结构体风格类的数组访问问题
看起来你在把C++的嵌套结构体移植到MicroPython时踩了一个常见的坑——没有正确创建实例化的列表,而是直接把类本身赋值给了属性,导致没法通过索引访问元素。咱们一步步来解决这个问题:
问题根源分析
你原来的代码里有两个关键错误:
- 在
tag_list的__init__中,self.tag = tag_info只是把tag_info这个类赋值给了tag属性,而不是创建一个tag_info实例的列表 - 在
data_packet的__init__中,self.tags = tag_list同样只是把tag_list类赋值给了tags属性,没有实例化这个类
这就导致你后续尝试用packet.tags.tag[i]访问时,本质是在尝试索引一个类,而不是可迭代的列表对象,自然会报错。
修正后的代码实现
我们只需要调整类的初始化逻辑,创建实例化的列表即可,完全不需要用继承或者namedtuple:
class tag_info: def __init__(self): self.id = "" self.rssi = 0 class tag_list: def __init__(self, tag_count=20): # 对应C++结构体里的20个tag元素 # 创建包含tag_count个tag_info实例的列表 self.tag = [tag_info() for _ in range(tag_count)] class data_packet(): def __init__(self): self.timestamp = 0 self.tags = tag_list() # 实例化tag_list类,而不是直接赋值类 self.heading = 0 self.airt = 0
使用示例
现在你可以像原来的C++代码一样正常访问嵌套的属性了:
packet = data_packet() for i in range(0, total_amount_of_tags - 1): print_function('id', packet.tags.tag[i].id, destination) print_function("rssi", packet.tags.tag[i].rssi, destination)
额外说明
如果你的标签数量不是固定的20个,也可以初始化一个空列表,之后动态添加实例:
class tag_list: def __init__(self): self.tag = [] # 初始化空列表 # 后续添加标签时 packet.tags.tag.append(tag_info())
这样就完美复刻了C++里嵌套结构体的行为,而且完全不需要依赖collections模块,非常适合Wipy的MicroPython环境。
内容的提问来源于stack exchange,提问作者makar
相关产品推荐
相关产品推荐

