c++ - 在 C++ 中循环数组时访问结构属性

标签 c++ arrays struct arduino platformio

我在遍历结构数组时遇到了问题。

我有这个结构:

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::arraysmarter enums of modern C++如果有的话。我不太了解 Arduino 可用和不可用的内容,因此我坚持使用基本的 C 样式数组和 enum。如果您有更好的工具,请使用它们。

然后访问 light 作为 sensors[LIGHT];

选项 2

使传感器存储指针并相应地更改访问。

sensor * sensors[] = {&light, &pressure,  .... };

我更喜欢第一个选项。没有重复,并且将项目放置在数组中错误位置的可能性较低。

关于c++ - 在 C++ 中循环数组时访问结构属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57875023/

相关文章:

c++ - 非静态数据成员的成员初始值设定项列表和默认成员初始值设定项之间有什么区别?

struct - 如何动态清除类型结构实例的值

c - 如何使用 posix_memalign 在 C 中正确对齐结构?

Java - 如何在模板类的构造函数中初始化包含 T 类型项目的数组?

c - qsort() 比较结构数组 : very strange behaviour

c++ - 创建一种接口(interface) C++

c++ - 如何从资源位图文件中为 directshow 滤镜加载图像数据?

C++ 创建文本适合编辑框

python - Cython 从现有数组和变量创建新数组的最快方法是什么

c - C 中的关联数组