Инициализировать перечисление строкой в ​​c (keil v5)uvision

Я использую этот код для получения строки из uart, затем сопоставляю их с этим enum, затем помещаю их в switch-case.

char temp[3],rx_buf[100];
enum form {
GGA = 1,
GSA
};
enum form gnssform ;

sprintf(temp,"%c%c%c",rx_buf[3],rx_buf[4],rx_buf[5]);
gnssform=temp;

Я не могу понять, что мы можем напрямую использовать что-то вроде ПРИМЕРА:

gnssform=GSA;

и нет ошибки, но это:

gnssform=temp;

не компилирует. и, пожалуйста, скажите мне возможный способ сделать это???, из-за этого ПРИМЕРА я считаю, что это должно быть возможно. ошибка:

значение типа "char *" не может быть присвоено объекту типа "enum form"

пожалуйста, не говорите мне использовать if-else, потому что я ненавижу это.

Наконец то использовал

if(rx_buf[3]=='G'&&rx_buf[4]=='G'&&rx_buf[5]=='A')gnssform=GGA; 
else if(rx_buf[3]=='G'&&rx_buf[4]=='S'&&rx_buf[5]=='A')gnssform=GSA;

2 ответа

Решение

GSA постоянное значение enum form,

temp является символьным указателем на три буквы "GSA".

Они не одно и то же, и вы не можете назначить их напрямую.

Там нет встроенного решения. Самый простой способ - использовать массив char*, в котором значение int для перечисления указывается в строке, содержащей описательное имя этого перечисления.

enum FRUIT_ENUM {
    apple, orange, grape, banana,
};

static const char *FRUIT_STRING[] = {
    "apple", "orange", "grape", "banana",
};

Тогда вы можете сделать что-то вроде ниже в цикле.

if (!strcmp(FRUIT_STRING[n],temp)) 
gnssform=n;
Другие вопросы по тегам