在sprintf中从'signed char *'无效转换为'char *'

时间:2018-05-22 06:17:09

标签: c++ char printf signed

好的,所以我收到此错误,我不知道如何修复它: 从“signed char *”无效转换为“char *”

Dong(char *)ulStatsAsPercentage没有帮助。

我在两个sprintf语句中,在第一个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 :(得分:0)

char类型(正如*printf("%s", ...)所预期的那样)具有实现定义的签名。它可以是有符号的或无符号的,它取决于编译器。

在您的情况下,默认情况下显然是无符号的。这意味着您不能将signed char数组视为字符串。任何signed char数组或指针都需要将其类型更改为charunsigned char(最佳解决方案),或者您可以强制显式转换:

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

答案 1 :(得分:0)

charsigned charunsigned 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 ++,不同的类型是不同的类型。