【问题标题】:Why can't I use a 'str[0]' to decode an enum in C++? [duplicate]为什么我不能使用“str[0]”来解码 C++ 中的枚举? [复制]
【发布时间】:2020-07-30 18:50:18
【问题描述】:

我正在解析来自“黑盒”屏幕控制器的字符串,并认为我可以使用枚举来解释各种参数。我试图理解为什么我的方法不起作用,虽然我知道它与类型和强制转换有关,但我似乎无法得出结论。我想知道它是否只是从根本上错误的方法,或者我错过了一些更基本的东西。流作为以 \n 结尾的字符串数组到达,我将其拆分,但随后需要根据“str[0]”中的“字母”来分析处理值的每个“令牌”的第一个字母。

显然没有理解重点,我不是在寻找编码解决方案,只是为了了解我的错误假设在哪里。


    enum TL_parEnum : char {X = 0, Y = 1, Z = 2};
    
    struct TL_params {
          bool seen;
          float value;
        };
        TL_params TL_parbuffer[9]{false,0};
    
    while (TL_parsub = strtok_r(TL_param, " ", &TL_param)) {
              char p = TL_parsub[0];
          switch (TL_parsub[0]) { 
          case 'Y' :
             TL_parbuffer[p].seen=true;
             TL_parbuffer[(TL_parEnum)p].value =atoi(&TL_parsub[1]);
    }

上面失败了,因为 (TL_parEnum)p 没有通过枚举进行评估,我得到 char 'Y' 或 ascii 59。但是如果我硬编码 (TL_parnum)Y,它会按预期工作。

我尝试过在 char、*char 甚至是我自己的结构(如 TL_parEnum(j))之间进行转换,但我只得到了 ascii 代码或字母,而不是我可以用来“解码”枚举的东西。

那么我是否对这应该如何工作做出了糟糕的假设?

这也是针对嵌入式控制器的,所以我无法访问所有 C++ 好东西,我想知道这是否是一个因素。

【问题讨论】:

  • (TL_parEnum)char j[0]; // fails and returns ascii code for Y .. ?从上面看,char j = Y; 也让这个问题有点......“不清楚”。
  • char j[0]; 不是有效的 C++
  • 你重复了变量名。

标签: c++ arrays enums char


【解决方案1】:

enums 主要是编译时特性;一旦代码被编译(除了调试符号),它被命名为Y 的事实就无关紧要了。如果不以某种方式手动为它编写查找表,则无法从 描述 enum 成员名称的字符转换为成员本身。即使j[0] 包含'Y',程序也不知道在执行代码时它会映射到值为1 的成员Y

如果你想启用这种转换,我建议为char 编写一个带有switch 语句的简单函数,其中包含每个ASCII 字符的大小写,并返回适当的enum 成员(带有当提供无法识别的字符时引发异常或终止程序的默认值)。

【讨论】:

  • 感谢 ShadowRanger - 以及所有提供评论的人。知道枚举是编译时间可以澄清事情。我试图避开即将写的很长的转换表,结果迷失在曲折的迷宫中。
猜你喜欢
  • 2018-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-02
  • 2012-05-04
  • 2016-09-03
  • 1970-01-01
相关资源
最近更新 更多