按下按钮时增加枚举值

Posted

技术标签:

【中文标题】按下按钮时增加枚举值【英文标题】:increment enum value when button pressed 【发布时间】:2014-03-05 05:16:42 【问题描述】:

我有下面的函数有枚举。如果按下按钮,我想增加值。

typedef enum 
  DATE_TIME,
  COORDINATE,
  WINDSPEED,
  POSITIONTRACK,
  DISPAY_PARAMETER,
  SET_PARAMETER,
  DISPLAY_TYPE_MAX
DISPLAY_SCREEN_TYPE;
DISPLAY_SCREEN_TYPE display_screen_type=DATE_TIME;

button=check_key();
if(button==RIGHT)
display_screen_type++;

编译时收到的错误消息。

error: no 'operator++(int)' declared for postfix '++', trying prefix operator instead
error: no match for 'operator++' in '++display_screen_type'

这是我的实际代码语法 CODE discription

【问题讨论】:

当然。枚举不是定义了算术运算的类型。您可以从 int 显式转换为 int,但这很丑。 如何将枚举声明为具有上述值的 int 也许您需要构建一个有限状态机 (FSM) 来正确处理程序的状态和状态之间的转换。正如@millinon 建议的那样,如果您的程序足够简单,您可以使用简单的switch,或者查看现有的 C++ FSM 库之一,例如 boost-extension.redshoelace.com/docs/boost/fsm/doc/… 这适用于 C,但不适用于 C++。 我正在使用它来实现 Switch 语句。假设如果 button== 右按两次,则它应该将枚举值更新更改为下一个。如果再次按下将其更改为下一个枚举值。 【参考方案1】:

您到底想完成什么?即使 enum 可能在编译器中使用 int 创建,尝试在 screen_type 变量上使用增量运算符 (++) 是否有意义?如果屏幕类型是DISPLAY_TYPE_MAX 并且按下了右键应该会发生什么?

可以强制编译器接受您的enum/int 转换,但这样做会使代码更难阅读。

enum 的目的是将变量的值限制为枚举包含的值。这几乎就像创建一个新的变量类型,并声明该类型被限制为一组特定的值。从这个意义上说,enum 并不真正意味着被视为一个数学值(如int),因此在一个上使用++ 并没有真正意义。

作为替代方案,我建议使用switch 或只编写一个函数来执行右键操作。

【讨论】:

我有 5 个键:上/下/右/左/选择。和菜单显示和设置。这 5 个键用于在循环内用于不同目的。 @开始默认显示:日期和时间。如果按下右键将显示更改为坐标,如果再次更改枚举值。我正在使用切换键来采取行动。【参考方案2】:

枚举值不应该有算术运算。它是一个值数量有限的集合。

虽然你可以在 c11 中声明枚举的底层类型来操作它。但 arduino 的 avr-compiler 可能不支持。

您可以将 enum 更改为 int/byte 类型,并将 enum 值定义为整数值。

#define DATE_TIME (0)
// other values. 
int display_type;

【讨论】:

以上是关于按下按钮时增加枚举值的主要内容,如果未能解决你的问题,请参考以下文章

尝试按下按钮将精灵的 zRotation 增加 1 度时旋转不正确

GAMEMAKER 2.o 按下按钮后增加计时器

当按下另一个可触摸的不透明度时,一个可触摸的不透明度不会按下

在 Swift 中按下 UIButton 时增加进度条值

USACO 2.2 Party Lamps 高能等效+规律枚举

连续按下按钮时如何加快前进/后退过程