недопустимое преобразование из 'char * в' char * 'в sprintf - PullRequest
0 голосов
/ 22 мая 2018

Хорошо, поэтому я получаю эту ошибку, и я не знаю, как ее исправить: недопустимое преобразование из 'char * * в' char * '

Dong (char *) ulStatsAsPercentage не помогает.

Я получаю эту ошибку в обоих операторах sprintf, в последнем аргументе каждого из них, в ulStatsAsPercentage в первом утверждении sprintf и в pxTaskStatusArray [x] .ulRunTimeCounter во втором утверждении sprintf.

Вот мой код:

  TaskStatus_t *pxTaskStatusArray;
  volatile UBaseType_t uxArraySize, x;
  unsigned long ulTotalRunTime, ulStatsAsPercentage;

  ulStatsAsPercentage =
              pxTaskStatusArray[ x ].ulRunTimeCounter / ulTotalRunTime;

  pxTaskStatusArray = (TaskStatus_t*)pvPortMalloc( uxArraySize * sizeof( TaskStatus_t ) );

   if( ulStatsAsPercentage > 0UL )
        {
           sprintf( pcWriteBuffer, "%s\t\t%lu\t\t%lu%%\r\n",
                             pxTaskStatusArray[ x ].pcTaskName,
                             pxTaskStatusArray[ x ].ulRunTimeCounter,
                             ulStatsAsPercentage );//error at this line
        }
        else
        {
           /* If the percentage is zero here then the task has
           consumed less than 1% of the total run time. */
           sprintf( pcWriteBuffer, "%s\t\t%lu\t\t<1%%\r\n",
                  pxTaskStatusArray[ x ].pcTaskName,
                  pxTaskStatusArray[ x ].ulRunTimeCounter );//error here too
        }

Вот консоль с ошибками:

../L5_Application/main.cpp:181:60: error: invalid conversion from 'signed char*' to 'char*' [-fpermissive]
                                  (char)ulStatsAsPercentage );

c:\users\alti\downloads\sjsu_dev\toolchain\arm-none-eabi\include\stdio.h:244:5: note:   initializing argument 1 of 'int sprintf(char*, const char*, ...)'
 int _EXFUN(sprintf, (char *__restrict, const char *__restrict, ...)
     ^
../L5_Application/main.cpp:181:60: warning: format '%lu' expects argument of type 'long unsigned int', but argument 5 has type 'int' [-Wformat=]
                                  (char)ulStatsAsPercentage );
                                                            ^
../L5_Application/main.cpp:181:60: warning: format '%lu' expects argument of type 'long unsigned int', but argument 5 has type 'int' [-Wformat=]
../L5_Application/main.cpp:189:74: error: invalid conversion from 'signed char*' to 'char*' [-fpermissive]
                                  pxTaskStatusArray[ x ].ulRunTimeCounter );
                                                                          ^
c:\users\alti\downloads\sjsu_dev\toolchain\arm-none-eabi\include\stdio.h:244:5: note:   initializing argument 1 of 'int sprintf(char*, const char*, ...)'
 int _EXFUN(sprintf, (char *__restrict, const char *__restrict, ...)
     ^

Любая помощь будет признательна.

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

char, signed char и unsigned char - это три различных типа.(§6.7.1 / 1 [basic.fundamental]).Все они должны иметь одинаковый размер и выравнивание, и char должен быть фактически идентичен одному из двух других, но они по-прежнему являются тремя отдельными типами.

Из-за правил целочисленного преобразования можно преобразоватьмежду тремя типами символов без явного приведения, поэтому совершенно верно следующее:

int fn(char ch);

int main() {
  signed char c = 'A';
  return fn(c);
}

Однако это не означает, что вы можете конвертировать между указателями в различные типы символов.

int fn(char* ch);

int main(void) {
  signed char c[] = {'A', 0};
  return fn(c);
}

⇒ (с g ++: clang ++ говорит: «Нет подходящей функции для вызова fn)

signed.cc: In function ‘int main()’:
signed.cc:5:14: error: invalid conversion from ‘signed char*’ to ‘char*’ [-fpermissive]
   return fn(c);
              ^
signed.cc:1:5: note:   initializing argument 1 of ‘int fn(char*)’
 int fn(char* ch);
     ^

Скомпилировано с C, а не C ++, выдает предупреждение (если -Wall указывается), а не ошибка, поскольку C более спокойно относится к присваиванию указателей разных типов.

Обратите внимание, что это не отличается, например, от функции, которая ожидает, что long* вызывается с long long*в архитектуре, где оба эти типа являются 64-битными арифметическими типами 2 с одинаковым расположением. Для C ++ разные типы - это разные типы.

0 голосов
/ 22 мая 2018

Тип char (как ожидается от *printf("%s", ...)) имеет подпись, определяемую реализацией.Он может быть как подписанным, так и неподписанным, это зависит от компилятора.

В вашем случае он, по-видимому, является неподписанным по умолчанию.Это означает, что вы не можете рассматривать массивы signed char как строки.Для любого массива или указателя signed char необходимо либо изменить его тип на char или unsigned char (лучшее решение), либо вы можете принудительно вызвать явное преобразование:

sprintf( (char*)pcWriteBuffer, ...  // quick & dirty fix
...