Получение имени перечисления из экземпляра перечисления
Здравствуйте, биржа стека Arduino!
У меня есть экземпляр enum
с именем state
:
enum States
{
SLEEP,
AWAKE,
CRAZY
} state;
States state = SLEEP;
Я хотел бы преобразовать значение state
в String
, чтобы я мог последовательно печатать его с помощью Serial.println()
.
В настоящее время, когда я набираю String(state)
, я получаю значение 0
, 1
и т. д. Я полагаю, что это соответствует индекс ключа enum
.
Как заставить его возвращать "SLEEP"
, "AWAKE"
и т. д.?
1 ответ
Лучший ответ:
Вы можете распечатать значение как есть:
Serial.println(state);
Это напечатает порядковый номер перечисления, но вы можете указать значение как любое число или char.
enum States
{
SLEEP = 'S',
AWAKE = 'A',
CRAZY = 'C'
};
Теперь, если вы напечатаете его с приведением к char Serial.println((char) state);
, он напечатает символ, что, на мой взгляд, намного лучше, чем какое-то число.
Если вы хотите преобразовать идентификаторы значений перечисления в строки, вы можете сделать это с помощью макроса препроцессора.
enum States
{
SLEEP,
AWAKE,
CRAZY
} state;
#define IDNAME(name) #name
const char* stateNames[] = {IDNAME(SLEEP), IDNAME(AWAKE), IDNAME(CRAZY)};
Я не думаю, что это лучше, чем печатать значения char. Для красивого принта лучше использовать описания.
const char* stateStr[] = {"Sleep", "Awake", "Undefined"};
Serial.println(stateStr[state]);
Любить это. Мне потребовалась минута (исходя из Python), чтобы понять, что #name
не было комментарием. Я использовал метод макроса препроцессора, спасибо!, @Intrastellar Explorer
- Объявленная переменная внутри void setup не видится в void loop
- Преимущества глобальных переменных перед статическими членами класса?
- Как улучшить этот Код? (или как передать строку Char в функцию, чтобы она вела себя как переменная)
- Как объявить массив переменного размера (глобально)
- Какие накладные расходы и другие соображения существуют при использовании структуры по сравнению с классом?
- Что лучше использовать: #define или const int для констант?
- Функции со строковыми параметрами
- Преобразование long в массив символов и обратно
ваш вопрос не связан с Arduino... это вопрос C++... пожалуйста, изучите перечисления и массивы, @jsotola
Сделаю @jsotola, спасибо!, @Intrastellar Explorer
"массивы" - это подсказка к решению, @jsotola
States state = IDLE;
не будет компилироваться :), @DataFiddlerАх, черт возьми, @DataFiddler, спасибо, что указали на это. В моем реальном коде больше случаев enum, IDLE был одним из них. Я обновил вопрос, чтобы удалить его, @Intrastellar Explorer
а ты мой ответ читал?, @Juraj
Да, я уже читал, наконец-то дошли руки проверить. Спасибо @Juraj, @Intrastellar Explorer