你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

sprintf使用的奇怪现象,怀疑for循环控制变量有BUG

[复制链接]
kylongmu 提问时间:2017-7-26 22:44 /
阅读主题, 点击返回1楼
收藏 1 评论38 发布时间:2017-7-26 22:44
38个回答
toofree 回答时间:2017-7-27 15:43:30
本帖最后由 toofree 于 2017-7-27 15:44 编辑

程序没有问题,你从哪打印输出的,是从串口吗?如果是串口的话,加个延时看看。

附件是一个软仿真的程序,从uart1打印输出,一切正常。
Hello_arm_2_keil5.rar (351.88 KB, 下载次数: 1)
vGuy 回答时间:2017-7-27 16:02:42
学习感受下。指针数组的问题
anobodykey 回答时间:2017-7-27 16:16:25
本帖最后由 anobodykey 于 2017-7-27 16:18 编辑

还是楼主代码有问题吧 test.jpg
其中"Hello %d\n\r\0",这段字符串长度是为10的,当i循环到9时,Dbg_QMsg[9]就是'\0'就会退出for循环了那。





kylongmu 回答时间:2017-7-27 16:19:28
anobodykey 发表于 2017-7-27 16:16
还是楼主代码有问题吧
其中"Hello %d\n\r\0",这段字符串长度是为10的,当i循环到9时,Dbg_QMsg[9]就是'\0' ...

论坛里贴代码有的是不能显示的,都注释说明了,还纠结。
kylongmu 回答时间:2017-7-27 17:06:16
本帖最后由 kylongmu 于 2017-7-27 17:17 编辑
toofree 发表于 2017-7-27 15:43
程序没有问题,你从哪打印输出的,是从串口吗?如果是串口的话,加个延时看看。

附件是一个软仿真的程序, ...

谢谢你的测试,我在你代码基础上改了一下,你的代码不会出问题,因为for循环外层调用次数没有达到数组大小。
我在你代码里面设置了2处printf,理论上都是不应该被执行到的,但神奇的是有一条在被调用一定次数后会执行到。
我只有767的板子,还请你再测试下。 Hello_arm_2_keil5.zip (104.48 KB, 下载次数: 2)
moyanming2013 回答时间:2017-7-27 18:35:04
anobodykey 发表于 2017-7-27 16:16
还是楼主代码有问题吧
其中"Hello %d\n\r\0",这段字符串长度是为10的,当i循环到9时,Dbg_QMsg[9]就是'\0' ...

楼主,你难道还无视23楼的回复吗?都这么明显了还不清楚?!
楼主你25楼的代码,第43行Dbg_QMsg里面存放的是
Hello 0\r\n\0
一共是9个非空字符,第9个(从下标0开始)是\0。
所以,在第46行中,当i为9时,就会执行第50行的break,从而从for循环中跳出来。
恩,你一定又是笔误,认为break是跳出的if语句吧?!(或当我没说)
1.sprintf会自动补\0,你不用多此一举在Dbg_QMsg中加个\0。
2.你分别在49行和54行加个断点全速运行下,如果停下可看下汇编以及当前的状态是什么样的?
kylongmu 回答时间:2017-7-27 21:14:37
Hello 0\r\n\0
一共是9个非空字符,第9个(从下标0开始)是\0。
所以,在第46行中,当i为9时,就会执行第50行的break,从而从for循环中跳出来。
恩,你一定又是笔误,认为break是跳出的if语句吧?!(或当我没说)

这里break就是跳出for用的,有用break跳出if的用法吗?
1.sprintf会自动补\0,你不用多此一举在Dbg_QMsg中加个\0。这个自动补\0倒是提醒的好,不过去掉后结果一样。
2.你分别在49行和54行加个断点全速运行下,如果停下可看下汇编以及当前的状态是什么样的?
断点进入错误代码,加了个变量k保存for结构里的j,可以看到j变0了,而k保留了原先的值0x0f
debug.jpg
moyanming2013 回答时间:2017-7-27 22:25:49
kylongmu 发表于 2017-7-27 21:14
Hello 0\r\n\0
一共是9个非空字符,第9个(从下标0开始)是\0。
所以,在第46行中,当i为9时,就会执行第50 ...

你根本一直都是在拿一个“意想”出来的例子在讨论!让别人去测试你的“意想”代码,自己却不测时而且实际的代码有很多错误自己却不去找找问题所在!这怎么能符合实际的呢?因为你实际的代码中:
你无法能保证你所理解的语法是否是正确的!但是你一直保证了这个是正确的,实际是错误多出(先别错误百出了)!
你也无法保证编写的代码是否是正确的!但是你一直保证了这个是正确的,实际是你的所谓的“笔误很多(如下述)!


你也无法保证编写的代码逻辑是正确的!但是你一直保证代码逻辑没问题,实际情况你自己琢磨吧。

我先不说你代码逻辑执行是否正确,只一看,476行中的for循环,红框处应该是j而不是i吧?这显然是所谓的笔误,再加上一开始的多个语法错误,整个让人抓狂啊!千万别再说往什么mbed提交了代码,那个只是个代码库,还得多修炼才行,省的...
另外,都实际的工程了,别再用i、j、k这种变量名称了,看看,自己都绕进去了,for循环的退出都无法保证,怎么保证与Dbg_QMsg中的内容判断呢?!
其它的不看了,没什么实质的可讨论的了,费时。
再次验证:
多从自身找问题!!
1.语法问题一堆。
2.逻辑实现并不清晰。
3.仍然不相信自己的代码有问题。
QQ截图20170727220945.jpg

kylongmu 回答时间:2017-7-27 23:42:47
moyanming2013 发表于 2017-7-27 22:25
你根本一直都是在拿一个“意想”出来的例子在讨论!让别人去测试你的“意想”代码,自己却不测时而且实际 ...

你眼睛很尖啊,我刚为了拷贝变量多申请了2个变量,不过结果是一样的,没什么臆想的代码,你太多心思了,一点代码问题就上纲上线。这个代码是我的项目用的,我犯得着在这臆想代码逗大家玩吗?
那个for循环条件不是关键,因为里面有break跳出。
你能正视关键问题吗?
toofree 回答时间:2017-7-28 02:28:56
本帖最后由 toofree 于 2017-7-28 02:32 编辑
kylongmu 发表于 2017-7-27 17:06
谢谢你的测试,我在你代码基础上改了一下,你的代码不会出问题,因为for循环外层调用次数没有达到数组大小 ...

傲游截图20170728022734.jpg

进不了异常状态,能说明问题了吗?

Hello_arm_2_keil5.rar (366.96 KB, 下载次数: 0)

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版