关于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
相关产品推荐
相关产品推荐

