Получение имени перечисления из экземпляра перечисления

Здравствуйте, биржа стека Arduino!

У меня есть экземпляр enum с именем state:

enum States
{
  SLEEP,
  AWAKE,
  CRAZY
} state;
States state = SLEEP;

Я хотел бы преобразовать значение state в String, чтобы я мог последовательно печатать его с помощью Serial.println().

В настоящее время, когда я набираю String(state), я получаю значение 0, 1 и т. д. Я полагаю, что это соответствует индекс ключа enum.

Как заставить его возвращать "SLEEP", "AWAKE" и т. д.?

, 👍3

Обсуждение

ваш вопрос не связан с Arduino... это вопрос C++... пожалуйста, изучите перечисления и массивы, @jsotola

Сделаю @jsotola, спасибо!, @Intrastellar Explorer

"массивы" - это подсказка к решению, @jsotola

States state = IDLE; не будет компилироваться :), @DataFiddler

Ах, черт возьми, @DataFiddler, спасибо, что указали на это. В моем реальном коде больше случаев enum, IDLE был одним из них. Я обновил вопрос, чтобы удалить его, @Intrastellar Explorer

а ты мой ответ читал?, @Juraj

Да, я уже читал, наконец-то дошли руки проверить. Спасибо @Juraj, @Intrastellar Explorer


1 ответ


Лучший ответ:

6

Вы можете распечатать значение как есть:

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