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

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

[复制链接]
kylongmu 提问时间:2017-7-26 22:44 /
阅读主题, 点击返回1楼
收藏 1 评论38 发布时间:2017-7-26 22:44
38个回答
toofree 回答时间:2017-7-28 02:43:25
提一点意见。

楼主,老改主楼帖子,这样不好。
帖子错了,可以往上加,备注一下什么时间修改过什么东西。
你这样老改,让其它人看到回复的楼层,不知道怎么回事。换种说法,你这样是对回复你帖子和看你帖子人的不尊重。
kylongmu 回答时间:2017-7-28 12:00:05
toofree 发表于 2017-7-28 02:28
进不了异常状态,能说明问题了吗?

我是在767板子上debug会进的,我准备把我的工程文件裁剪一个出来给大家实测。
moyanming2013 回答时间:2017-7-28 12:05:28
kylongmu 发表于 2017-7-27 21:14
Hello 0\r\n\0
一共是9个非空字符,第9个(从下标0开始)是\0。
所以,在第46行中,当i为9时,就会执行第50 ...

1.476行,你用i作为for循环的条件,但是for循环体内没有对i的操作,这就导致for循环的退出和此前i的值有关,和j的值无关。
不管你是有意还是无意这样,逻辑上都是错误的,功能上自然也就出现你说的所谓“奇怪现象”,其实一点都不奇怪,见下述。
QQ截图20170728114241.jpg
2.断点停止处,j为0。你总是怀疑为什么j是0,j不是应该在for循环里面加加了吗?
其实在断点前,for循环根本就没执行for循环体,因为在进for循环前i的值是0xC8=200,而我断定此时你的QUEUE_MESSAGE_MAX_SIZE肯定是200,这就导致了for循环不会执行循环体,从而j的值是0,然后就执行了你的P_msg1的打印。
你不是一直疑问为什么吗?这就是为什么!你的代码逻辑混乱而且是错误的!跟什么for循环、sprintf、其它的这bug那bug都无关,这是你自己有bug
当你尝试把QUEUE_MESSAGE_MAX_SIZE改为1000,你又会发现当执行了1000次后又出现了错误。这是肯定的,因为你必须在i被加加了1000次后就一定会出现不再执行for循环体的情况!你的i至少在492行当该函数每被调用且执行一次就会加1,当加到和QUEUE_MESSAGE_MAX_SIZE相等时就一定会出现j为0的情况,因为for循环体根本就没进。
QQ截图20170728114537.jpg
3.我们论坛的同学都是极其负责任和谨慎的,感谢@toofree同学一直不厌其烦的、拿出自己宝贵的时间给你测试你的“意想”代码,请问你测试过你“意想”出来的代码吗?就直接说代码有问题?你是一直在拿“意想”的代码和实际的项目代码对比,实际项目的代码有问题时,你就“意想”一个所谓类似的代码,这能一样吗?再说了你意想可以,但总的自己先测试下吧!大家的时间都很宝贵!
你缺乏基本的职业道德!
没错,程序员也需要职业道德!
4.我也发现楼主不停的改帖子,改可以总的留下原始的,好让后来者认清楚这到底是真bug还是假bug,认清楚多从自身找问题的事实,这也没白费我们的时间和精力!
楼主是虚伪的!
把错误的内容都删掉,不就是在说明“我这么厉害,怎么会犯这种低级的错误呢”,有问题就正视问题这没什么大不了的,有问题还掩盖那就是真虚伪。
为了防止你删图片,我下载了你27楼的图片,上述都是从下图中截取的,方便放大了好看: debug.jpg



moyanming2013 回答时间:2017-7-28 12:26:24
本帖最后由 moyanming2013 于 2017-7-28 12:29 编辑
kylongmu 发表于 2017-7-27 17:06
谢谢你的测试,我在你代码基础上改了一下,你的代码不会出问题,因为for循环外层调用次数没有达到数组大小 ...

我在26楼都强调了!:
1.你在25楼代码里面的,分别在49行和54行加个断点全速运行下,如果停下可看下汇编以及当前的状态是什么样的?
2.你为什么不给个25楼的代码运行至断点处的截图?@toofree在30楼测试了这个代码无问题!你只给实际项目的断点截图,能是一会事情吗?!
3.还是你根本就无法自圆其说?要么就是根本就没测试?要么就是测试了运行不到断点(这是肯定的),从而还在拿实际项目里面的代码说事呢?!能有些职业道德吗?!


我备份了你25楼代码的截图:

171433f9hm1912rv212f2m.jpg


kylongmu 回答时间:2017-7-28 13:10:16
moyanming2013 发表于 2017-7-28 12:26
我在26楼都强调了!:
1.你在25楼代码里面的,分别在49行和54行加个断点全速运行下,如果停下可看下汇编以 ...

感谢你不断的挑毛病,虽然你总要说些代码之外的问题,但还是在热心的帮忙。
我只有767的板子,而且工程文件不方便直接给出,偷了懒只把问题代码贴了出来,这是我的问题,不回避。
听取意见,以后直接上传工程文件。
kylongmu 回答时间:2017-7-28 13:49:48
moyanming2013 发表于 2017-7-28 12:05
1.476行,你用i作为for循环的条件,但是for循环体内没有对i的操作,这就导致for循环的退出和此前i的值有 ...

这是我重新设置了j,k来观察问题,抱歉代码没全改好,把大家的注意力误导了。
之前我确实怀疑问题出现在贴出的代码上,没有什么臆想与故意。
前面另外一贴求助USB的,dsjsjf 点出了我的heap 要设置大。后来我增加sprintf后出现莫名情况,因此注意力集中在sprintf上。
问题的出在我工程里用了FreeRTOS有USB CDC,sprintf,这些部分会动态申请内存,stack默认太小,应该是越界了。
别生气啊,有时候遇到问题第一时间真找不准故障代码的。
kylongmu 回答时间:2017-7-28 14:21:57
toofree 发表于 2017-7-28 02:43
提一点意见。

楼主,老改主楼帖子,这样不好。

抱歉,一开始怀疑的问题误导了大家,我之前也一直在贴出的代码里打转转。
现在原因找到了与我主贴给出的描述就不在一个点上,不是for循环控制变量,在我工程里删除了这段for代码用别的代码来测试又变成了其它怪问题。
toofree 回答时间:2017-7-28 15:11:59
moyanming2013 发表于 2017-7-28 12:26
我在26楼都强调了!:
1.你在25楼代码里面的,分别在49行和54行加个断点全速运行下,如果停下可看下汇编以 ...

我也是醉了,能把人气死:lo
kylongmu 回答时间:2017-7-28 15:45:30
toofree 发表于 2017-7-28 15:11
我也是醉了,能把人气死:lo

别生气,不是那个代码的问题,把for那一段删了改别的又是其它错误现象,核心问题在sprintf,抱歉把大家引到for结构上了。
只能说一句sprintf,小心使用,C语言不检查堆栈溢出问题,而mcu默认设置的堆栈太小,容易进坑。
1234

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版