我有一个名为PacketList的类。它有一个私人成员,是std::list:
std::list<数据包_t>packets_(Packet_t是我全局定义的结构(
以及作为该列表的迭代器的私有成员:
std::list<数据包_t>:迭代器it=packets_.begin((
我有一个公共成员函数,它每次返回一个列表元素:
Packet_t advance_one_packet() {
if (it != packets_.end()) {
it++;
}
else {
it = packets_.begin();
}
Serial.print("current packet is ");
Serial.println(it->name);
return *it;
}
每隔几秒钟从main.cpp调用advance_one_packet((,以显示下一个数据包的内容。如果列表为空,则不会调用它。
这一切在第一次浏览列表时都非常完美。但在它返回列表中的最后一个元素,然后执行它=packets_begin((之后,会发生一些不好的事情。我知道这一点是因为在这一点上,Serial.print("当前数据包是"(成功,但Serial.println(it->name(严重崩溃!我的串行监视器输出如下:
current packet is BME280temp
current packet is BME280pressure
// now it's trying to show the first element again:
current packet is $��?4␒��␐␀␀␀v���@␙�?␁�Al ␀␀␀xV����@␙�?␁�Al ␀␀␀xV�� (etc., etc.)
你觉得我做错了什么吗?我应该能够在列表中不断循环,对吧?谢谢你的任何想法。
回想一下,end()
不是指最后一个元素,而是"一个过去";最后一个元素。
[packet 0] -> [packet 1] -> [packet 2] -> [end indicator]
^^^^^^^^^^ ^^^^^^^^^^^^^^^
packets_.begin() packets_.end()
在it
指向最后一个元素(数据包2(的情况下输入函数时,它不等于.end()
,因此递增迭代器。现在它等于.end()
,下面对it->name
的调用试图取消引用某个未指定的位置,该位置在输出中显示为垃圾。