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

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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版