Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
浮点型
sprintf
浮点数打印
printf 不支持浮点型格式化输出?
发布于 2021-04-19 11:32:10 浏览:1223
订阅该版
版本:完整版 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); } } ```  创建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); } } ``` 结果:  可以创建json 字符串出来。 ``` LOG_E("is num = %d",cJSON_IsNumber(n)); ``` 打印出来时正常的,说明能创建这个json 对象 于是我debug cJSON_PrintUnformatted()。  执行到这个if (!print_value(item, buffer)) 中跳转失败了。 继续往下走 json 字符串就创建失败了。 于是我将断点打到这个print_value() 函数中  确实能进入这个case里 单步进来 数字的长度报错。  接着 断点打在这个length 赋值的地方。 直接进入else中  单步下来 length 被赋值  这个值错了, d=100 赋值是正确的 于是我打开了菜鸟工具 C语言在线编译器  于是我就整不明白了。这个lenght 的长度为什么不对?。。。 接着我把这个长度强行改变它的值 lenght =3 发现   这我就更不明白了。。。 猜测是这个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; } ... ```  问题的根源找到了 printf 不支持浮点型的格式化输出??? 搞配置搞配置!!!   接着来搞 测试 ``` 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); } } ```  哦了 关键很奇怪的就是 我原先没有加入这个浮点型的支持 它也可以使用 但是不是每次编译 都能使用 就很奇奇怪怪的
查看更多
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
写了还是懒
 打印浮点数必须开启libc  如果勾选newlib的话要支持浮点需要额外勾选这几项
撰写答案
登录
注册新账号
关注者
0
被浏览
1.2k
关于作者
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
机器人操作系统 (ROS2) 和 RT-Thread 通信
4
五分钟玩转RT-Thread新社区
5
国产MCU移植系列教程汇总,欢迎查看!
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
RT-Thread 中的 Github Actions
2
RT-Thread 学习笔记:memheap 死机问题的分析与解决
3
pkgs --update 踩坑记录
4
没有menuconfig的bsp如何添加.config Kconfig
5
开源之夏 2023 | RT-Thread 邀你参与开源,项目奖金最高达12000元!
热门标签
RT-Thread Studio
串口
LWIP
Env
SPI
AT
FinSH
ART-Pi
Bootloader
CAN总线
Hardfault
文件系统
USB
DMA
RT-Thread
线程
SCons
RT-Thread Nano
stm32
MQTT
ESP8266
ota
RTC
WIZnet_W5500
rt-smart
UART
flash
rtthread
packages_软件包
freemodbus
潘多拉开发板_Pandora
I2C
cubemx
FAL
定时器
PWM
BSP
AB32VG1
ADC
中断
消息队列_msg_queue
SDIO
msh
keil
Debug
socket
SFUD
LVGL
编译报错
C++_cpp
本月问答贡献
宇宙码蚁
11
个答案
3
次被采纳
rcp
9
个答案
3
次被采纳
张世争
24
个答案
2
次被采纳
用户名由3_15位
3
个答案
2
次被采纳
出出啊
3
个答案
2
次被采纳
本月文章贡献
IcyFeather
4
篇文章
9
次点赞
chejia12
4
篇文章
1
次点赞
燕十三
3
篇文章
22
次点赞
dejavudwh
3
篇文章
5
次点赞
zhjylzh
3
篇文章
4
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部