Инициализировать перечисление строкой в 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;