如何解决从EEPROM读取数据时,将结构与虚拟继承一起使用是否是个坏主意? Arduino
我遇到了一个奇怪的问题,即如果我从EEPROM加载数据结构,则会将其错误地转换。但是,如果我同时调用了负责保存数据结构的函数和负责读取数据结构的函数,那么它将成功将数据投射到我的结构中。
我已经解决了这个问题,并且注意到如果将其读为uint8_t
,则保存的数据和从EEPROM读取的数据总是正确的。但是由于某种原因,当程序中未使用保存功能并且我们仅从EEPROM读取数据时,它无法将数据转换为我的数据结构(BareKeyboardKey2
)。
以下是导致问题的原因:
// testStruct.h
struct IKey2
{
int pin;
};
struct BareKeyboardKey2 : virtual IKey2
{
int keyCode;
BareKeyboardKey2() {}
BareKeyboardKey2(int _pin,int _keyCode)
{
pin = _pin;
keyCode = _keyCode;
}
};
我第一次调用SaveStruct然后调用LoadStruct的示例输出。 (我保存到EEPROM的数据是BareKeyboardKey2(2,4)
:
读数:0x68 0x1 0x4 0x0 0x2 0x0
PIN:2,键码:4
如您所见,它正确地投射了BareKeyboardKey2
,但是...
这是仅调用LoadStruct时的示例输出(与上一示例相同的数据存储在EEPROM中):
读数:0x68 0x1 0x4 0x0 0x2 0x0
密码:-18248,密码:4
如您所见,从EEPROM读取的数据(即0x68 0x1 0x4 0x0 0x2 0x0
)在两个示例之间是相同的,但是在后一个示例中,它无法将数据正确地转换为BareKeyboardKey2(pin: -18248,keycode: 4
)
我发现,如果将结构更改为以下内容,则无论我随后使用SaveStruct
和LoadStruct
还是仅使用LoadStruct
,它都可以工作:
// testStruct.h
struct IKey2
{
};
struct BareKeyboardKey2 : virtual IKey2
{
int pin;
int keyCode;
BareKeyboardKey2() {}
BareKeyboardKey2(int _pin,int _keyCode)
{
pin = _pin;
keyCode = _keyCode;
}
};
我还发现,如果我将两个变量都这样移动到IKey2中……:
struct IKey2
{
int pin;
int keyCode;
};
struct BareKeyboardKey2 : virtual IKey2
{
BareKeyboardKey2() {}
BareKeyboardKey2(int _pin,int _keyCode)
{
pin = _pin;
keyCode = _keyCode;
}
};
...这将导致程序将两个变量都转换为错误。输出示例:pin: -18248,keycode: -18248
是什么原因导致这种行为,我该怎么做才能使其保持一致?
解决方法
我找到了解决问题的方法。我不是100%确定是正确的,但这是我的理论...
将非POD结构作为字节保存到EEPROM时,它不会保存主结构与连接到该结构的虚拟对象之间的连接。因此,数据是相同的,但是如果使用调试器(在我的情况下为gdb)调查对象,您将看到连接主结构和虚拟对象的虚拟ptr是无效的指针。虽然,最初存在于主结构中的其余数据仍然完整。
因此,为了解决该问题,我通过从结构中删除虚拟继承将结构转换为POD类型。取而代之的是,我使用的是“具有”关系,到目前为止,无论上面使用的情况如何,我的数据都可以从EEPROM正确读取。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。