Цели указателя при инициализации отличаются подписью - PullRequest
0 голосов
/ 12 января 2019

Это мой код. Я получаю предупреждение о том, что цели при инициализации отличаются подписью. кто-нибудь может мне помочь

 const uint8_t *activity_output[4] = {"B_STILL", "B_WALk", "B_RUN", "B_UNKNOWN"};

1 Ответ

0 голосов
/ 12 января 2019

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*, они отличаются только подписью.

Возможные исправления:

  1. Перейти к символу. Поскольку activity_output является массивом строк (т. Е. char[]), можно ожидать, что он будет иметь тип char*[], т.е. массив указателей на строки. Ваше намерение было бы ясно тогда. Если вы используете его позже с printf("%s". ...), это путь.

    const char *activity_output[4] = {
        "B_STILL",
        "B_WALk", 
        "B_RUN", 
        "B_UNKNOWN"
    };
    
  2. Приведите указатели в явном виде.

    const uint8_t *activity_output[4] = {
        (uint8_t*)"B_STILL",
        (uint8_t*)"B_WALk", 
        (uint8_t*)"B_RUN", 
        (uint8_t*)"B_UNKNOWN"
    };
    
  3. Использовать составные литералы .

    const uint8_t *activity_output[4] = {
        (uint8_t[]){"B_STILL"},
        (uint8_t[]){"B_WALk"}, 
        (uint8_t[]){"B_RUN"}, 
        (uint8_t[]){"B_UNKNOWN"}
    };
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...