Предупреждение компилятора о SDCC: указатель потерял целевую квалификацию

Я получаю предупреждение компилятора, вот код:

uint8 executeSpecialCommand(const char *string)
{
    char *parameters;           
    parameters = strtok(string, "=");

    if (parameters)
     {
         usbSendf("\nProcessing Parameters...");       
         while(parameters != NULL)
         {
             parameters = strtok(NULL, " ");
             usbSendf("\n%s", parameters);
         }
         return 1;
     }
    else
        return 0;   
}

ошибка указывает на строку 3, и я думаю, что это потому, что "=". strtok ожидает const char* как-то в других частях кода, я использую то же самое и не получаю предупреждения. Идеи здесь, чтобы помочь обучить меня?

ОБНОВЛЕНИЕ Я получаю ошибку:

предупреждение 196: указатель цели потерял const квалификатор

Спасибо

1 ответ

Решение

strtok Функция изменяет свой первый аргумент. Со страницы руководства:

ОШИБКИ Будьте осторожны при использовании этих функций. Если вы используете их, обратите внимание, что:

   * These functions modify their first argument.

   * These functions cannot be used on constant strings.

Это означает, что вы можете передать const char* в качестве первого аргумента, как вы делаете с переменной с именем string,

strtok работает, вставляя NULL в передаваемую строку в каждом разделителе, что позволяет ему возвращать каждый токен без выделения памяти для возвращаемой строки. Я сомневаюсь, поддерживает ли SDCC реентерабельную версию strtok_r но было бы возможно использовать это вместо этого, если это существовало.

Или создайте собственную копию входящей строки перед анализом. Если вы знаете максимальный размер входящей строки, то копия строки может быть размещена в стеке в верхней части вашей функции синтаксического анализа.

Другие вопросы по тегам