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

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

[复制链接]
kylongmu 提问时间:2017-7-26 22:44 /
阅读主题, 点击返回1楼
收藏 1 评论38 发布时间:2017-7-26 22:44
38个回答
kylongmu 回答时间:2017-7-27 14:24:37
本帖最后由 kylongmu 于 2017-7-27 14:27 编辑
moyanming2013 发表于 2017-7-27 13:59
1.i是什么类型的?注意最大值越位问题。
2.你这种在for循环里面加if判断Dbg_QMsg数组时,当i为100时就直 ...

1.i是什么类型的?注意最大值越位问题。
uint32_t
2.你这种在for循环里面加if判断Dbg_QMsg数组时,当i为100时就直接死机了!还是你的代码有问题!
QUEUE_MESSAGE_MAX_SIZE也不知道是多少?!
Dbg_QMsg是用来打印的,每次打印的数据远小于100(看代码),都是0地址开始打印
QUEUE_MESSAGE_MAX_SIZE设置为1000
3.确保其它代码无问题?逻辑实现无问题?
我经常会碰到各种BUG,有的能解决,有的能绕过去,但是这个BUG现象会导致代码行为在运行一段时间后不可预知。-------------------------------------------------------------------
同样代码我用VStudio编译测试,根本没有这个现象。
moyanming2013 回答时间:2017-7-27 14:33:10
kylongmu 发表于 2017-7-27 14:24
1.i是什么类型的?注意最大值越位问题。
uint32_t
2.你这种在for循环里面加if判断Dbg_QMsg数组时,当i为10 ...

你碰到bug的几率这么高、这么厉害?!
我建议你赶紧改行,这些行业更赚钱!:
1.找bug也能赚钱!谷歌已奖励了600万美元
http://news.zol.com.cn/566/5668050.html
2.微软BUG奖励计划升级 找BUG最高奖金升至10万美元
http://tech.huanqiu.com/news/2015-08/7212547.html
3.“漏洞之王”一年可以赚多少外快?
http://www.chinaz.com/news/2016/0412/520989.shtml

赚了钱别忘了回来谢我!
kylongmu 回答时间:2017-7-27 14:41:56
本帖最后由 kylongmu 于 2017-7-27 14:44 编辑
moyanming2013 发表于 2017-7-27 14:33
你碰到bug的几率这么高、这么厉害?!
我建议你赶紧改行,这些行业更赚钱!:
1.找bug也能赚钱!谷歌已奖 ...

天气热,技术问题,说的别那么酸爽。
我从51到ti的6678,xilinx,altera,actel,lattice的fpga都做过,mcu也用了很多系列了。做过的usb,pcie的逻辑核与驱动程序。薪水不用你操心了。
uboot里还有我报告的bug修正,mbed上mpu9250的驱动我是第一个贡献源代码,并提供了绕过芯片IIC接口的BUG方法:
http://developer.mbed.org/users ... ba240c1/MPU9250.cpp
moyanming2013 回答时间:2017-7-27 14:47:46
kylongmu 发表于 2017-7-27 14:41
天气热,技术问题,说的别那么酸爽。
我从51到ti的6678,xilinx,altera,actel,lattice的fpga都做过,mc ...

你厉害,做了那么多,可是为什么连指针数组和字符数组都分不清呢?
恩,一定是你的笔误造成的!
kylongmu 回答时间:2017-7-27 14:53:47
moyanming2013 发表于 2017-7-27 14:47
你厉害,做了那么多,可是为什么连指针数组和字符数组都分不清呢?
恩,一定是你的笔误造成的! ...

说了这个现象不是那个问题引起的,已经更正。你这人喜欢抬扛啊!
七哥 回答时间: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跳出。
你能正视关键问题吗?
七哥 回答时间: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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版