Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
sprintf
浮点数打印
printf 不支持浮点型格式化输出?
发布于 2021-04-19 11:32:10 浏览:2079
订阅该版
版本:完整版 V4.0.2 软件包: rt_cjson_tools-latest 现象: 在做项目的过程中 经常出现cjson创建失败的情况。 debug时发现,cJSON_AddNumberToObject创建cjson对象时 经常创建失败。故有此次测试。 测试环境: main.cpp ``` int main(void) { test(); for (;;) { rt_thread_mdelay(1000); } return RT_EOK; } void test(void) { cJSON *xRoot = RT_NULL; cJSON *xObject = RT_NULL; char *pJson = RT_NULL; cJSON *n = RT_NULL; xRoot = cJSON_CreateObject(); if (NULL == xRoot) return; xObject = cJSON_CreateObject(); if (NULL == xObject) return; n = cJSON_AddNumberToObject(xRoot, "SHADHALKJF", 100); LOG_E("is num = %d",cJSON_IsNumber(n)); cJSON_AddStringToObject(xRoot, "Manufacturer", "hello world"); pJson =cJSON_PrintUnformatted(xRoot); if(pJson == NULL) { LOG_W("NULL"); } // pJson = cJSON_Print(xRoot); rt_kprintf("%s\n", pJson); if (pJson) { cJSON_free(pJson); } if (xRoot) { cJSON_Delete(xRoot); } } ``` ![image.png](https://oss-club.rt-thread.org/uploads/20210419/71c5d105687e94a5901cc28b1f24eb31.png) 创建json字符串失败。 于是我屏蔽了cJSON_AddNumberToObject()函数 ``` void test(void) { cJSON *xRoot = RT_NULL; cJSON *xObject = RT_NULL; char *pJson = RT_NULL; cJSON *n = RT_NULL; xRoot = cJSON_CreateObject(); if (NULL == xRoot) return; xObject = cJSON_CreateObject(); if (NULL == xObject) return; // n = cJSON_AddNumberToObject(xRoot, "SHADHALKJF", 100); // LOG_E("is num = %d",cJSON_IsNumber(n)); cJSON_AddStringToObject(xRoot, "Manufacturer", "hello world"); pJson =cJSON_PrintUnformatted(xRoot); if(pJson == NULL) { LOG_W("NULL"); } // pJson = cJSON_Print(xRoot); rt_kprintf("%s\n", pJson); if (pJson) { cJSON_free(pJson); } if (xRoot) { cJSON_Delete(xRoot); } } ``` 结果: ![image.png](https://oss-club.rt-thread.org/uploads/20210419/c75ab1006431fd36380b281d92600fb7.png) 可以创建json 字符串出来。 ``` LOG_E("is num = %d",cJSON_IsNumber(n)); ``` 打印出来时正常的,说明能创建这个json 对象 于是我debug cJSON_PrintUnformatted()。 ![image.png](https://oss-club.rt-thread.org/uploads/20210419/91ff01d3c358220ff0945983ab6e679c.png) 执行到这个if (!print_value(item, buffer)) 中跳转失败了。 继续往下走 json 字符串就创建失败了。 于是我将断点打到这个print_value() 函数中 ![image.png](https://oss-club.rt-thread.org/uploads/20210419/a64b254b96304e01d7ea9e295d16dc5e.png) 确实能进入这个case里 单步进来 数字的长度报错。 ![image.png](https://oss-club.rt-thread.org/uploads/20210419/57ec75f7f497d99272159e0e3a738bf4.png) 接着 断点打在这个length 赋值的地方。 直接进入else中 ![image.png](https://oss-club.rt-thread.org/uploads/20210419/c6d5221b5c82c39309a44df89176dd95.png) 单步下来 length 被赋值 ![image.png](https://oss-club.rt-thread.org/uploads/20210419/5b6795397ad94c8d42b96594339a4773.png) 这个值错了, d=100 赋值是正确的 于是我打开了菜鸟工具 C语言在线编译器 ![image.png](https://oss-club.rt-thread.org/uploads/20210419/b5a5eac6efcd5d80c4dd0b33931ec8aa.png) 于是我就整不明白了。这个lenght 的长度为什么不对?。。。 接着我把这个长度强行改变它的值 lenght =3 发现 ![image.png](https://oss-club.rt-thread.org/uploads/20210419/2a6169f896a991a45322b4db1b5d7475.png) ![image.png](https://oss-club.rt-thread.org/uploads/20210419/353205cfad4da7cd0c5abd751933580f.png) 这我就更不明白了。。。 猜测是这个sprintf没有格式化输出这个浮点型字符串。 好 又开始下面的测试了。。。 ``` int main(void) { // test(); int length = 0; double d = 100.12; char number_buffer[26] = {0}; length = sprintf((char*)number_buffer, "%1.15g",(double) d); printf("length = %d\n", length); printf("number_buffer = %s\n", number_buffer); printf("double num = %lf\n",200.34); for (;;) { rt_thread_mdelay(1000); } return RT_EOK; } ... ``` ![image.png](https://oss-club.rt-thread.org/uploads/20210419/136c8628f12645e754397054e26136c8.png) 问题的根源找到了 printf 不支持浮点型的格式化输出??? 搞配置搞配置!!! ![image.png](https://oss-club.rt-thread.org/uploads/20210419/a83a41e071be18f7a60935efd8050cab.png) ![image.png](https://oss-club.rt-thread.org/uploads/20210419/12b27d0a46249e2fd5947749863b1ab9.png) 接着来搞 测试 ``` void test(void) { cJSON *xRoot = RT_NULL; cJSON *xObject = RT_NULL; char *pJson = RT_NULL; cJSON *n = RT_NULL; xRoot = cJSON_CreateObject(); if (NULL == xRoot) return; xObject = cJSON_CreateObject(); if (NULL == xObject) return; n = cJSON_AddNumberToObject(xRoot, "SHADHALKJF", 100); LOG_E("is num = %d", cJSON_IsNumber(n)); cJSON_AddStringToObject(xRoot, "Manufacturer", "hello world"); pJson = cJSON_PrintUnformatted(xRoot); if (pJson == NULL) { LOG_W("NULL"); } // pJson = cJSON_Print(xRoot); rt_kprintf("%s\n", pJson); if (pJson) { cJSON_free(pJson); } if (xRoot) { cJSON_Delete(xRoot); } } ``` ![image.png](https://oss-club.rt-thread.org/uploads/20210419/e1a44290864eadb2914f68eb28942124.png) 哦了 关键很奇怪的就是 我原先没有加入这个浮点型的支持 它也可以使用 但是不是每次编译 都能使用 就很奇奇怪怪的
查看更多
flashman2002
2021-04-19
这家伙很懒,什么也没写!
是的,系统默认printf 不支持浮点型的格式化输出,目的是为了节省空间。为解决浮点型的格式化输出问题,需要你在编译器配置中打开浮点型的格式化输出的选项才行。
4
个回答
默认排序
按发布时间排序
keyq
2021-04-19
这家伙很懒,什么也没写!
加入C++ 支持之后 原先C Linker链接器配置选项没有了,所以之前写的那些关于浮点型格式化输出的部分都不能用了。。导致的
mii
2021-04-19
这家伙很懒,什么也没写!
我也使用跟您的一样的版本开发过CJSON,但并未遇见过楼主的情况,我拼接将近400个字节的字符串都成功,并未出现失败的情况。但由于我使用的是207,在配置里并没有float ABI的选项,估计是芯片差异造成。
Jone
2021-04-19
写了还是懒
![image.png](https://oss-club.rt-thread.org/uploads/20210419/8ffd2d9f5832c3d0b8c5eecc669e772b.png) 打印浮点数必须开启libc ![image.png](https://oss-club.rt-thread.org/uploads/20210419/f8e4120a0d109de2c3449e5f137ec342.png) 如果勾选newlib的话要支持浮点需要额外勾选这几项
撰写答案
登录
注册新账号
关注者
0
被浏览
2.1k
关于作者
keyq
这家伙很懒,什么也没写!
提问
23
回答
9
被采纳
0
关注TA
发私信
相关问题
1
调用 stdio 库中的 snprintf 编译不通过。
2
使能C++ 后浮点数无法打印
3
printf打印浮点数,前半段时间有小数点,后面输出小数点没有了。
4
请问为什么sprintf 打印浮点数就会 hard fault...
5
浮点数打印时,小数点变为 “uart”
6
关于rt_kprintf无法显示浮点数
7
怎么实现printf函数打印浮点数?
8
使能ulog打印浮点数后,进程崩溃
9
rt-thread printf打印信息(包含打印浮点型float)
10
使用ulog组件不能打印浮点数问题
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
【24嵌入式设计大赛】基于RT-Thread星火一号的智慧家居系统
2
RT-Thread EtherKit开源以太网硬件正式发布
3
如何在master上的BSP中添加配置yml文件
4
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
5
RT-Thread 发布 EtherKit开源以太网硬件!
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
MicroPython
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
16
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
6
个答案
2
次被采纳
用户名由3_15位
13
个答案
1
次被采纳
本月文章贡献
程序员阿伟
9
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
5
次点赞
RTT_逍遥
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部