C++浮点数和字节数组的联合问题
C++ Union of a Float and a Byte Array Issue
我正在研究一个arduino(基于AVR平台(,我有一个方法可以接收浮点数并将其写入EEPROM。我必须将浮点数转换为字节数组才能与EEPROM交互。我有两个功能如下:
void WriteFloatToEEPROM(int address, float value) {
union {
byte byteVal[4];
float floatVal;
} data;
data.floatVal = value;
for (int i = 0; i < 4; i++) {
EEPROM.update(address + i, data.byteVal[i]);
}
}
float ReadFloatFromEEPROM(int address) {
union {
byte byteVal[4];
float floatVal;
} data;
for (int i = 0; i < 4; i++) {
uint8_t readValue = EEPROM.read(address + i);
data.byteVal[i] = readValue;
}
return data.floatVal;
}
当我打印出结果时,我得到以下几个例子:
Read value at address 50 for float read 0
Read value at address 51 for float read 0
Read value at address 52 for float read 0
Read value at address 53 for float read 0
Returned float val for address 50:0.00
Read value at address 90 for float read 0
Read value at address 91 for float read 0
Read value at address 92 for float read 0
Read value at address 93 for float read 160
Returned float val for address 90:-0.00
Read value at address 130 for float read 44
Read value at address 131 for float read 113
Read value at address 132 for float read 61
Read value at address 133 for float read 138
Returned float val for address 130:-0.00
Read value at address 170 for float read 0
Read value at address 171 for float read 0
Read value at address 172 for float read 0
Read value at address 173 for float read 0
Returned float val for address 170:0.00
我是否错误地使用了联合/向后写入EEPROM还是什么?此外,如果有人有更好的方法,我愿意接受建议。提前致谢
读取不是联合的"活动"字段是UB(未定义的行为(。
您必须使用memcpy
:
void WriteFloatToEEPROM(int address, float value) {
byte byteVal[sizeof(float)];
memcpy(byteVal, &value, sizeof(float));
for (int i = 0; i < sizeof(float); i++) {
EEPROM.update(address + i, byteVal[i]);
}
}
float ReadFloatFromEEPROM(int address) {
byte byteVal[sizeof(float)];
for (int i = 0; i < sizeof(float); i++) {
byteVal[i] = EEPROM.read(address + i);
}
float f;
memcpy(&f, byteVal, sizeof(float));
return f;
}
Arduino 为对象提供了 .put(( 和 .get(( 方法EEPROM
因此您不必重新发明轮子。您的代码可以像以下那样简单:
void WriteFloatToEEPROM(int address, float value)
{
EEPROM.put(address, value);
}
float ReadFloatFromEEPROM(int address)
{
float value;
EEPROM.get(address, value);
return value;
}
.put()
的行为方式也与.update()
类似
此函数使用
EEPROM.update()
来执行写入,因此不会 如果值没有更改,则重写该值。
这是结构和联合的常见问题。您需要调查"对齐"。默认通常为"word"(2 个字节(,因此您的byte byteVal[4];
可以占用 8 个字节(byte, empty, byte, empty ...
(。您必须使用__attribute__ ((packed))
来避免它。
相关文章:
- cpp二进制搜索问题,计算给定数组中输入元素的出现次数
- 输入std::数组时出现问题
- 类对象数组的问题会导致崩溃
- 传递二维数组时出现问题
- 从 C++ 中的函数返回数组地址问题
- 使用数组时出现问题
- 打印问题.我在数组中打印值时遇到一些问题
- C++:__aligned(__alignof__) 导致字符数组数据出现问题?
- 将字节数组转换为带有字节序问题的指针
- C++ 填充数组时遇到问题
- 遇到此问题时遇到困难:允许用户输入数组的值并使用 for,而循环也输出输入的最大数字
- 这是使用回溯的 nqueen 问题,但我使用了动态 2d 数组,我的程序编译良好,但不返回任何输出
- 当我尝试通过 arduino 上的引用传递布尔数组时出现问题
- 我正在尝试解决一个需要数组总和值但代码不起作用的问题,我想做这样的事情
- 编写 cin.get() 以接收字符数组时出现问题
- 在 C++ Consol 中的数组中执行用户命令时出现问题
- 存储另一个函数返回的布尔数组时遇到问题
- 当我在 CLion 中读取数组中的 txt 文件时C++编码问题
- 运行时C++数组初始化问题
- 我在解决此错误时遇到问题.我正在努力在主函数中传递数组