首页 > 解决方案 > 使用枚举范围进行简单的状态跟踪

问题描述

我正在使用一系列用于嵌入式系统状态管理的枚举。

我现在正在实现的是一个系统,以一种简单的方式向用户显示特定模块的状态。所以我想将这些不同的状态转换为 3 个超级状态,在这种情况下,红色/黄色/绿色表示错误/配置/运行。

到目前为止,我实现它的简单方法如下。

enum State
{
  StateAA = 0,
  StateAB,
  StateAC,
  
  StateBA = 100,
  StateBB,
  StateBC,
  
  StateCA = 200,
  StateCB
};

void DisplayState(State st)
{
    if(st < 100)
        displayColor = red;
    else if(st < 200)
        displayColor = yellow;
    else
        displayColor = green;
}

这允许在不调整显示功能的情况下管理对枚举的更改,只要范围没有更改。

然而,这感觉有点 hacky,为了找到更好的答案,我很难措辞这个问题。任何建议,将不胜感激。

标签: c++embeddedc++98

解决方案


这看起来确实“hacky”。而是考虑使用状态机,其中每个状态依次使用自己的内部状态机。这个内部状态应该与程序的其余部分无关,而是私有封装。

还要避免手动为枚举分配值,如果不这样做,则可以将枚举类型用作数组索引,这很方便。如果你不这样做,你也可以State_n在最后使用成员的老派技巧,然后对应于使用的状态数。(这反过来可以static_assert针对数组等以确保程序完整性。)


推荐阅读