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



好的,所以我收到此错误,我不知道如何解决它: 从"签名字符*"到"字符*"的转换无效

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数组或指针都需要将其类型更改为charunsigned char(最佳解决方案(,或者您可以强制显式转换:

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

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

相关内容

  • 没有找到相关文章

最新更新