好的,所以我收到此错误,我不知道如何解决它: 从"签名字符*"到"字符*"的转换无效
Dong (char*(ulStatsAsPercent无济于事。
我在两个 sprintf 语句中都收到此错误,在每个语句的最后一个参数中,在第一个 sprintf 语句中的 ulStatsAsPercent 中,在第二个 sprintf 语句中的 pxTaskStatusArray[ x ].ulRunTimeCounter 中。
这是我的代码:
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, "%stt%lutt%lu%%rn",
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, "%stt%lutt<1%%rn",
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:usersaltidownloadssjsu_devtoolchainarm-none-eabiincludestdio.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:usersaltidownloadssjsu_devtoolchainarm-none-eabiincludestdio.h:244:5: note: initializing argument 1 of 'int sprintf(char*, const char*, ...)'
int _EXFUN(sprintf, (char *__restrict, const char *__restrict, ...)
^
任何帮助将不胜感激。
char
类型(如*printf("%s", ...)
所期望的那样(具有实现定义的符号性。它可以是有符号的或无符号的,这取决于编译器。
在您的情况下,默认情况下它显然是未签名的。这意味着您不能将数组视为字符串signed char
。任何signed char
数组或指针都需要将其类型更改为char
或unsigned char
(最佳解决方案(,或者您可以强制显式转换:
sprintf( (char*)pcWriteBuffer, ... // quick & dirty fix
char
、signed char
和unsigned char
是三种不同的类型。(§6.7.1/1 [基本基础](。它们必须具有相同的大小和对齐方式,并且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++,不同的类型是不同的类型。