一个由数组越界引发的。。。

今天写一小段段,哈哈

曾经写过一个软件,vxWorks应用程序,纯C,其中有一段是要将USB接收到数据进行解析,也就是将接收到的数存在循环缓冲队列里,然后用while循环去遍历解析,遍历的时候,我定义一个局部变量,从循环缓冲队列里逐个取数,进行处理转换,这样做没有问题,但是效率低啊,低在从USB接收到数要逐一复制到数组,并且解析时要处理过多的无效数据,因为循环缓冲队列你没法判断每包数据的帧头和上一包帧尾之间的距离,就算有一万个无效数据也只能逐一遍历。。。(可能是我比较小白)。

后来改成了按照消息队列进行处理,将USB端接收到的数据按包放进消息队列,在接收端,直接取出一包数存在临时数组里,进行处理,这么做的优点有:1、直接按数据包进行转存,快!(USB数据包都是定长的,你发1个数,包长度512,收到是512,用0补齐);2、按包处理后,解析端解析到帧尾,这一包后面的数就可以直接抛了,完全不会影响后面,爽!消息队列和USB简直不能再般配!

氮素,我这会遇到一个问题,总会莫名重复处理数据,比如说我一共接收到28包数据,解析程序应该逐次处理,直到处理完成,但是莫名其妙的会从中间某个地方开始重复处理,导致解析失败。经过各种排查,怀疑USB发多数,消息队列重复读,缓冲区大小不合适等等,弄得我都要少白头了,最后只好一点一点检查代码中的错误,检查了两天之后改掉一个不起眼的小地方,问题解决了,就这样解决了。。。。

原因是这样,终于说到主题了。。。偷笑我在解析函数中定义了一个临时数组用来存从消息队列收到的数,数组的大小length等于消息每帧消息的长度,我在while遍历这个数组时用了这样的语句“while(i<=length)”;说完了。。。其实没啥,一个小疏忽,五万行中的一个小疏忽,浪费了我两天时间,国庆假期中间的两天。。。

在看C++Primer, 作者时时强调数据的越界是导致各种异常状况产生的主要原因,有感而发一段!女神怎么都带不上,怎么回事啊,谁能告诉我???

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值