You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于sprintf中signed char*转char*无效转换错误的技术求助

解决 invalid conversion from 'signed char*' to 'char*' 及相关格式警告问题

咱们来一步步拆解你遇到的问题,然后给出具体的修复方案:

1. 核心类型不匹配错误(signed char* → char*)

报错的根源其实很清晰:你的pcWriteBuffer是signed char*类型,但标准库的sprintf函数第一个参数要求的是char*类型(从报错里的initializing argument 1 of 'int sprintf(char*, const char*, ...)'就能确认)。你之前错误地去强制转换后面的ulStatsAsPercentage,完全找错了对象哦。

修复方法:在调用sprintf时,把第一个参数pcWriteBuffer强制转换成char*就好:

sprintf( (char*)pcWriteBuffer, "%s\t\t%lu\t\t%lu%%\r\n", ... );

2. 格式符不匹配警告(%lu期望long unsigned int)

你看到的format '%lu' expects argument of type 'long unsigned int'警告,是因为你错误地用了(char)ulStatsAsPercentage强制转换——这把一个unsigned long类型的变量转成了单个signed char(也就是int类型),自然和%lu格式符不匹配。

另外,你计算ulStatsAsPercentage的方式也有问题:

ulStatsAsPercentage = pxTaskStatusArray[ x ].ulRunTimeCounter / ulTotalRunTime;

这是整数除法,结果只会是0或者1(除非单个任务占了100%的运行时间),正确的百分比计算应该先乘100再做除法,避免提前截断:

ulStatsAsPercentage = (unsigned long)((pxTaskStatusArray[x].ulRunTimeCounter * 100UL) / ulTotalRunTime);

完整修复后的代码片段

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

// 注意:你原来的代码顺序有严重问题!先分配内存再访问数组元素
pxTaskStatusArray = (TaskStatus_t*)pvPortMalloc( uxArraySize * sizeof( TaskStatus_t ) );
// 补充:这里需要先获取uxArraySize和ulTotalRunTime,比如:
// uxArraySize = uxTaskGetNumberOfTasks();
// 然后调用uxTaskGetSystemState()填充数组,再计算总运行时间

// 正确的百分比计算方式
ulStatsAsPercentage = (unsigned long)((pxTaskStatusArray[x].ulRunTimeCounter * 100UL) / ulTotalRunTime);

if( ulStatsAsPercentage > 0UL ) {
    // 转换pcWriteBuffer为char*,移除错误的(char)强制转换
    sprintf( (char*)pcWriteBuffer, "%s\t\t%lu\t\t%lu%%\r\n", 
             pxTaskStatusArray[ x ].pcTaskName, 
             pxTaskStatusArray[ x ].ulRunTimeCounter, 
             ulStatsAsPercentage );
} else {
    sprintf( (char*)pcWriteBuffer, "%s\t\t%lu\t\t<1%%\r\n", 
             pxTaskStatusArray[ x ].pcTaskName, 
             pxTaskStatusArray[ x ].ulRunTimeCounter );
}

额外提醒

  • 你原来的代码顺序有bug:先访问了pxTaskStatusArray[x],再调用pvPortMalloc分配内存,这会导致未定义行为(访问野指针),一定要先分配内存、填充数组后再使用元素。
  • 如果你的编译器要求比较严格,也可以直接把pcWriteBuffer的类型定义为char*,从根源上避免类型转换的麻烦。

内容的提问来源于stack exchange,提问作者alti21

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:23:10