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

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

[复制链接]
kylongmu 提问时间:2017-7-26 22:44 /
阅读主题, 点击返回1楼
收藏 1 评论38 发布时间:2017-7-26 22:44
38个回答
七哥 回答时间: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代码用别的代码来测试又变成了其它怪问题。
七哥 回答时间: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默认设置的堆栈太小,容易进坑。
123

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版