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

时间:2018-02-21 11:44:13

标签: c++ enums arduino esp8266 arduino-esp8266

在我想要更改在程序开头声明的枚举值(全局)时,编译错误已经好几个月了,在一个用整数替换它的函数中。

在我没有这个问题之前,但是我已将代码从迷你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 个答案:

答案 0 :(得分:1)

您无法将int隐式转换为匿名枚举。 可能的解决方案是使用int中的静态强制转换,但是你应该声明你的枚举不是匿名的。

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 );

答案 1 :(得分:1)

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 ++中的反射非常接近。