OpenEdv-开源电子网
标题:
【探】同样的语句出现的效果却不一样!
[打印本页]
作者:
萨斯电电
时间:
2015-8-31 16:01
标题:
【探】同样的语句出现的效果却不一样!
今天在做FPU实验的时候,发现了个很奇怪的问题,仿照着原子哥的test.c敲出来的代码效果竟然不一样,大家先来找找茬,看下下面两句代码哪里不一样?!
(, 下载次数: 4)
上传
点击文件名下载附件
~
~
~
咳咳...好了..不用看了.再看半天我猜你们也是会认为,这两个语句尼玛是复制出来的吧!?哪里不一样了!?
接下来我们来做下实验——
这是注释掉1号,留下2号的效果
(, 下载次数: 3)
上传
点击文件名下载附件
这是注释掉2号,留下1号的效果
(, 下载次数: 4)
上传
点击文件名下载附件
两张图片有什么不同?看左下角就知道了!一个有runtime,另一个没有!
为什么呢?这是相同的语句啊?!
唯一不同的是………………
~
2号语句是我直接复制原子哥例程的语句,1号语句是我自己敲出来的。
问题来了。。。。。我敲的为啥就不行呢??
~
~
经过一个1小时的检查,通过各种手段,检查生成的汇编代码,把这两个语句换位置,改变代码的位置等。。。。。发现
。。
。。
这两句代码真的不一样!
1号代码的zoom:%d后面的两个空格是
tab
2号代码的zoom:%d后面的两个空格是空格
把tab改成空格后,问题就解决了!
~
可是,根本问题还没解决,为什么tab会把字符串后面的内容隔绝掉显示不出来,而空格却不会?难道sprintf会以tab作为结束字符?
之后用仿真看了下打印到buf的内容,又检查了这个sprintf打印出来的buf的去处,找到下面一段代码——
(, 下载次数: 4)
上传
点击文件名下载附件
还有他的定义
(, 下载次数: 5)
上传
点击文件名下载附件
~
~
~
最后,问题终于迎刃而解了。。。sprintf并不会把tab作为结束符,tab还是打印到数组buf上了,问题就来源于这个函数的实现,它有个非法字符的判断,对照ASCII表,tab(0x09) 不在 空格(0x20) 到 ~(0x7e) 之间,因此被识别成非法字符,由此退出循环,TAB后面的东西也不在显示了!
~
~
希望这次的经验能够帮助到遇到同样问题的坛友们!这次的经历也让我明白到了事物的存在必定有其原因,有时候眼睛看到的并不一定是最真实的,结果不对,肯定还有我们忽略掉的东西。
作者:
龙之谷
时间:
2015-8-31 16:11
学习了,谢谢分享
作者:
正点原子
时间:
2015-8-31 21:40
非常不错的问题分析,论坛就需要有这种钻研精神的网友。
很好,很cool
作者:
w417074951
时间:
2015-9-1 09:35
厉害啊,。。
作者:
一般BDN
时间:
2015-9-1 09:44
虽然只是个小细节,但如果真的自己碰到了,估计也要找好一会儿。谢谢楼主了
作者:
jermy_z
时间:
2015-9-1 09:52
这个屌,要是遇到了,估计得抓瞎
作者:
physics
时间:
2015-9-1 11:05
非常好的帖子,小问题,但是显示出楼主钻研的精神,只要有这种精神,哪怕是菜鸟,最终也会成为大师的。
作者:
zuoyi
时间:
2015-9-1 20:39
谢谢 楼主
作者:
正点原子
时间:
2015-9-1 21:15
回复【7楼】physics:
---------------------------------
是的,关键是要学会学习,学会找问题,这是目前很多网友所不具备的。
作者:
月牙业务
时间:
2015-10-18 08:50
楼主写的很好
作者:
月无缺
时间:
2017-2-5 17:06
这个很cool,要是我遇到了,估计是找不出来的。
作者:
695735073
时间:
2017-2-5 22:31
分析很到位
作者:
woddeg2
时间:
2017-2-7 18:05
这个确实厉害了,确实值得我们大家学习。。
作者:
还是看不穿
时间:
2017-2-7 21:51
楼主真厉害!!把问题都研究透,学习了!!
作者:
烈日灼心
时间:
2019-7-29 22:23
我要是遇到这个问题,我TM一辈子都搞不出来吧
作者:
yyq006
时间:
2019-7-30 08:46
高手,佩服!
作者:
chen46820
时间:
2019-7-31 09:17
学习了,谢谢分享
作者:
Q5154
时间:
2019-8-4 19:00
学习了6666
作者:
bootblack
时间:
2019-9-25 18:39
这个要点赞,必须的
欢迎光临 OpenEdv-开源电子网 (http://47.111.11.73/)
Powered by Discuz! X3.4