我在遍历结构数组时遇到了问题。
我有这个结构:
struct sensor
{
float data = 0;
bool status = false;
Idx idx; //enum
SensorType type; //enum
};
它包含一些适用于我的 arduino 的传感器。
因此,为了发送我从他们那里收到的数据,我想在循环中使用传感器阵列。
这是我的数组定义:
sensor sensors[] = {light, pressure, pressureHpa, temperature, humidity, temperatureOut, humidityOut};
最后,我想遍历这个数组并调用一些方法,但是当我尝试按索引访问任何传感器时,我得到所有属性的零值。
for (unsigned int i = 0; i < sizeof(sensors) / sizeof(sensor); i++)
{
Serial.print("type:");
Serial.print(sensors[i].type);
Serial.print(" sens.idx:");
Serial.print(sensors[i].idx);
Serial.print(" sens.data:");
Serial.print(sensors[i].data);
Serial.print(" sens.status:");
Serial.print(sensors[i].status);
Serial.println();
}
在这个循环中我得到如下输出:
type:0 sens.idx:0 sens.data:0.00 sens.status:0
type:0 sens.idx:0 sens.data:0.00 sens.status:0
type:0 sens.idx:0 sens.data:0.00 sens.status:0
type:0 sens.idx:0 sens.data:0.00 sens.status:0
type:0 sens.idx:0 sens.data:0.00 sens.status:0
type:0 sens.idx:0 sens.data:0.00 sens.status:0
type:0 sens.idx:0 sens.data:0.00 sens.status:0
但是,当我像这样直接访问我的任何结构时:
Serial.print("type:");
Serial.print(pressure.type);
Serial.print(" pressure.idx:");
Serial.print(pressure.idx);
Serial.print(" pressure.data:");
Serial.print(pressure.data);
Serial.print(" sens.status:");
Serial.print(pressure.status);
Serial.println();
我得到:
type:3 pressure.idx:13 pressure.data:0.00 sens.status:1
最佳答案
light
已定义并保留其默认值。
sensor sensors[] = {light, pressure, pressureHpa, temperature, humidity, temperatureOut, humidityOut};
将 light
复制到 sensors[0]
中。这意味着 sensors[0]
包含与 light
相同的数据,但与 light
不同。稍后当代码为 light
赋值时,sensors[0]
的拷贝保持不变。
选项 1
丢弃 light
和 friend 。添加一个命名传感器的枚举类型
enum sensor_names
{
LIGHT, // will be 0
PRESSURE, //will be 1
...
NR_SENSORS // must be last. Used to size the array and for loop terminators
};
并使sensors
成为一个大小正确的简单数组
sensor sensors[NR_SENSORS];
欢迎使用std::array
和 smarter enum
s of modern C++如果有的话。我不太了解 Arduino 可用和不可用的内容,因此我坚持使用基本的 C 样式数组和 enum
。如果您有更好的工具,请使用它们。
然后访问 light
作为 sensors[LIGHT];
选项 2
使传感器
存储指针并相应地更改访问。
sensor * sensors[] = {&light, &pressure, .... };
我更喜欢第一个选项。没有重复,并且将项目放置在数组中错误位置的可能性较低。
关于c++ - 在 C++ 中循环数组时访问结构属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57875023/