代码之家  ›  专栏  ›  技术社区  ›  Léo Charpentier

将函数中状态枚举的全局值更改为int值

  •  1
  • Léo Charpentier  · 技术社区  · 6 年前

    几个月前,当我想在一个用整数替换的函数中更改程序开头声明的枚举(全局)的值时,出现编译错误。

    之前,我没有这个问题,但在将我的代码从迷你arduino卡切换到ESP8266后,问题出现了。。它没有相同的编译器??

    下面的错误仍然阻碍我继续我的项目。。我找不到解决方案:

    ERROR : request for member 'state' in 'CYCLE_ARROSAGE', which is of non-class type '<anonymous enum>'

    下面是一个简化的问题示例:

    enum {
        S, // SECURITE
        N, // NUIT
        J1_1, J1_2, J1_3,  // Luminosité 1
        J2_1, J2_2, J2_3,  // Luminosité 2
        J3_1, J3_2, J3_3, // Luminosité 3
    } CYCLE_ARROSAGE; // SECURITE
    
    void setup () {
        CYCLE_ARROSAGE = N; // OK
    }
    
    void loop () {
        CheckChangementCycleArrosage(J2_2);
    }
    
    
    void CheckChangementCycleArrosage(int NouveauCycle ){
    
         if(CYCLE_ARROSAGE != NouveauCycle){
    
              Serial.print("CYCLE CHECKE : ");
              Serial.println(NouveauCycle); // -> 6
    
              Serial.print("CYCLE CHECKE CAST: ");
              Serial.println(String(NouveauCycle)); // -> 6
    
              Serial.print("CYCLE ARROSAGE: ");
              Serial.println(CYCLE_ARROSAGE); // -> 1
    
              CYCLE_ARROSAGE = NouveauCycle; // -> ERROR
        }
    }
    

    解决方案是什么?我不明白。。

    2 回复  |  直到 6 年前
        1
  •  1
  •   Nikita Smirnov    6 年前

    不能将int隐式转换为匿名枚举。 可能的解决方案是使用从int到的静态强制转换,但您应该将yout enum声明为非匿名。

    enum EnumName {S, // SECURITE
    N, // NUIT
    J1_1, J1_2, J1_3,  // Luminosité 1
    J2_1, J2_2, J2_3,  // Luminosité 2
    J3_1, J3_2, J3_3, // Luminosité 3
    } CYCLE_ARROSAGE; // SECURITE
    
    ...
    
    CYCLE_ARROSAGE = static_cast< EnumName >( NouveauCycle );
    
        2
  •  1
  •   Lightness Races in Orbit    6 年前

    Gover是正确的,尽管有一个[讨厌的]解决方案可以保持匿名枚举:

    CYCLE_ARROSAGE = static_cast<decltype(CYCLE_ARROSAGE)>(NouveauCycle);
    

    works 因为 CYCLE_ARROSAGE 还有一个 类型 .

    它只是没有一个可以键入名称的类型。

    当然,你现在可以给它一个:

    using MyEnumType = decltype(CYCLE_ARROSAGE);
    CYCLE_ARROSAGE = static_cast<MyEnumType>(NouveauCycle);
    

    This 与C++中的反射非常接近。