A строковый литерал (например, "a string"
) имеет тип char[N]
. На вашей машине char
есть signed char
. Это означает, что "B_STILL"
действительно (signed char[]){"B_STILL"}
, массив signed char
байтов.
uint8_t
(обычно) является typedef для unsigned char
и является беззнаковым типом.
Таким образом, когда вы инициализируете указатель uint8_t *
из строкового литерала "B_STILL"
, вы конвертируете указатель char*
(массивы в C автоматически распадаются на указатели для типа, т. Е. char[N]
распадается на указатель char*
) в uint8_t *
указатель. Таким образом, компилятор предупреждает вас - вы конвертируете указатель signed char*
в указатель unsigned char*
, они отличаются только подписью.
Возможные исправления:
Перейти к символу. Поскольку activity_output
является массивом строк (т. Е. char[]
), можно ожидать, что он будет иметь тип char*[]
, т.е. массив указателей на строки. Ваше намерение было бы ясно тогда. Если вы используете его позже с printf("%s". ...)
, это путь.
const char *activity_output[4] = {
"B_STILL",
"B_WALk",
"B_RUN",
"B_UNKNOWN"
};
Приведите указатели в явном виде.
const uint8_t *activity_output[4] = {
(uint8_t*)"B_STILL",
(uint8_t*)"B_WALk",
(uint8_t*)"B_RUN",
(uint8_t*)"B_UNKNOWN"
};
Использовать составные литералы .
const uint8_t *activity_output[4] = {
(uint8_t[]){"B_STILL"},
(uint8_t[]){"B_WALk"},
(uint8_t[]){"B_RUN"},
(uint8_t[]){"B_UNKNOWN"}
};