[求助] 看看这段代码有什么问题

jishuaihu   2016-3-21 10:02 楼主
  1. for(i = 0; i< SENSORNUM ;i++)
  2. {
  3. if(Lost[i] < 24)
  4. {
  5. Lost[i] ++;
  6. }
  7. else
  8. {
  9. SensorCode[i][0] = 0;
  10. SensorCode[i][1] = 0;
  11. SensorCode[i][2] = 0;
  12. SensorCode[i][3] = 0;
  13. SensorCode[i][4] = 0;
  14. SensorCode[i][5] = 0;
  15. SensorData[i].Tem = 0;
  16. SensorData[i].Hum = 0;
  17. SensorData[i].Bat = 0;
  18. SensorData[i].RSSI = 0;
  19. }
  20. }
最近写了一个程序,里面有上面这样一段代码,作用是当某一个条件不满足时进行计数,达到指定次数后把另外的一组数清零。按照我的思路,lost数组里的数不会大于24,可是仿真的时候经常发现lost里面有很大的数,而且明显技术的时间还没有到呢。比如设备复位后,在初始化完成后设断点,此时看lost数组里面的数还都是0,接下来在lsot++处设置断点,全速运行到断点处的时候lsot数组里面有一些数就已经不是0了。而且是很大的数。 大家有没有遇到过类似的情况?或者给想 想有没有其他的可能~! QQ图片20160321101643.png 第一次运行到断点处的样子 谢谢 本帖最后由 jishuaihu 于 2016-3-21 10:17 编辑

回复评论 (6)

Lost[]没有初始化?
Lost[]下边的数组溢出?
虾扯蛋,蛋扯虾,虾扯蛋扯虾
点赞  2016-3-21 10:18
引用: littleshrimp 发表于 2016-3-21 10:18
Lost[]没有初始化?
Lost[]下边的数组溢出?

lost初始化了。
lost下面的数组溢出还不敢确定,我找一下啊。不过应该是lost上面的数组溢出导致的吧?
点赞  2016-3-21 10:21
引用: jishuaihu 发表于 2016-3-21 10:21
lost初始化了。
lost下面的数组溢出还不敢确定,我找一下啊。不过应该是lost上面的数组溢出导致的吧?

对,上边,我说错了。
其它地方对Lost[]做处理了吗?
虾扯蛋,蛋扯虾,虾扯蛋扯虾
点赞  2016-3-21 10:22
引用: littleshrimp 发表于 2016-3-21 10:22
对,上边,我说错了。
其它地方对Lost[]做处理了吗?

其他的地方就一个清零。
我大概知道上面原因了。我对另外的一个数组复制的时候没有判断数组标号,应该是那儿的问题,我加一个判断试试啊。
谢谢
点赞  2016-3-21 10:24
先试一下强行写成一个固定数 再跑。如果这都能出问题,那再去考虑别的东西写穿了这个数组
点赞  2016-3-21 10:27
引用: 辛昕 发表于 2016-3-21 10:27 先试一下强行写成一个固定数 再跑。如果这都能出问题,那再去考虑别的东西写穿了这个数组
搞定了,谢谢 littleshrimp说的对,是其他的数组越限了 我说一下是的应用,给大家提供一些教训。 我做的是一个无线接收模块的数据处理终端,无线模块接收到的数据会以串口的形式发送给我的单片机。单片机接收到后进行处理。我一开始代码是这样的。这个是串口中断里面的一部分代码。
  1. Temp = USART_ReceiveData(USART3);
  2. if(RevIndex == 0)
  3. {
  4. GroupID = Temp;
  5. }
  6. else if(RevIndex == 1)
  7. {
  8. DeviceID = Temp - 1;
  9. }
  10. else
  11. {
  12. SensorCode[DeviceID][RevIndex - 2] = Temp;
  13. }
问题的关键在于SensorCode[DeviceID][RevIndex - 2] = Temp; 这一句里面没有判断DeviceID的范围是否越限。这样的话编译的时候是没有越限的,不会提示警告,而实际运行的时候DeviceID收到的数如果是错误的话,就可能导致SensorCode越限。结果赶巧了是到lost数组。找到问题后我把代码修改为下面的结果。
  1. Temp = USART_ReceiveData(USART3);
  2. if(RevIndex == 0)
  3. {
  4. GroupID = Temp;
  5. }
  6. else if(RevIndex == 1)
  7. {
  8. if((Temp>0)&&(Temp < (SENSORNUM +1)))
  9. {
  10. DeviceID = Temp - 1;
  11. }
  12. else
  13. {
  14. DeviceID = 0xFF;
  15. }
  16. }
  17. else
  18. {
  19. if(DeviceID < SENSORNUM)
  20. {
  21. SensorCode[DeviceID][RevIndex - 2] = Temp;
  22. }
  23. else
  24. {
  25. //数据丢掉,不作处理
  26. }
  27. }
在两个地方对DeviceID进行了判断。接收和使用的时候都加了判断,如果发现DeviceID数据异常,则直接丢弃这一包数据。避免最开始的情况。 大家也帮忙看看修改后的代码有没有问题没有, 此贴到此也算是结贴了吧。从提出问题到现在基本半个小时 本帖最后由 jishuaihu 于 2016-3-21 10:39 编辑
点赞  2016-3-21 10:32
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复