重庆-风雪 发表于 2014-10-30 00:46:49

for循环变死循环,求大神支支招!

虽然我知道看代码很蛋疼,但是实在没办法,求大家帮帮忙!
问题就是程序在执行下面这个子函数的时候一直循环,Debug了一下,确实跳不出来,找不到原因,代码如下:
void PatternOne()
{
    char                x,y;
        uchar ucMoveSpeed= 15;                                           /* 通过累积循环次数控制移动时间 */
    bit   bInitMark    =1;                                           /* 清0数组标志位,1则清,0反之*/
        bit   bChangeSpeed =0;                                           /* 速度改变标志位,1则改变0反之 */
       
    for (x = 0;x < 16;x++)                                                       
    {
          /* 清0数组标志位置1则清0,0反之 */
      if (bInitMark && (8 != x))
          {
                  /* (字模为阴码,亮为1,灭为0) */
            InitialTab(0x00);
          }
                /* 前八次,将字模从0维放到7维 */
                if (x < 8)
                {
            for (y = 0;y < 8;y++)
            {
                DisTab = PatternOneTab;
                  }
                }
                /* 后八次,从7维放到0维 */
      else
      {
            for (y = 0;y < 8;y++)
            {
                          if (bInitMark)
                {DisTab = PatternOneTab;}
                                else
                                {DisTab = 0x00;        }
                  }
                }
               /* 通过累积循环次数控制移动时间 */
      for (y = 0;y < ucMoveSpeed;y++ )
      {
            Display1();
      }
                /* 第一次循环完成,处理标志位,从头循环*/
                if ((15 == x) && (1 == bInitMark))
                {
                  InitialTab(0x00);
                        /* 第二次循环不清0数组 */
            bInitMark    =0;
                        /* 第二次循环改变移动速度 */
                        bChangeSpeed =1;
                        /* 将x清0,进行第二次循环,由于本次
                       * 循环结束后x会自加1,所以减一修正
                       */
                        x            = -1;
                }
                /* 标志位置一,改变速度 */
                if (bChangeSpeed)
                {
                  if (x < 8)
                        {
                          ucMoveSpeed--;
                        }
                        else
                        {
                          ucMoveSpeed++;
                        }
                }
    }
}

jianhong_wu 发表于 2014-10-30 10:35:50

我教你一种调试方法,叫做逐步删减法。这段代码就这么多,你每减去一部分,就编译测试一下,直到你能跳出循环为止,那么当前被删除的那部分代码就是有bug的代码。

hww5408 发表于 2014-10-30 10:50:55

兄弟,代码规范很重要,这样写代码发,过一段时间,你也不认识它,它也不认识你。
建议重写。

重庆-风雪 发表于 2014-10-30 20:16:57

jianhong_wu 发表于 2014-10-30 10:35
我教你一种调试方法,叫做逐步删减法。这段代码就这么多,你每减去一部分,就编译测试一下,直到你能跳出循 ...

好的,我试试!

重庆-风雪 发表于 2014-10-30 20:18:01

hww5408 发表于 2014-10-30 10:50
兄弟,代码规范很重要,这样写代码发,过一段时间,你也不认识它,它也不认识你。
建议重写。

我的代码严格按照朱老师说的去写的,确实不知道如何去优化了,兄台有何高见?

重庆-风雪 发表于 2014-10-31 22:57:15

jianhong_wu 发表于 2014-10-30 10:35
我教你一种调试方法,叫做逐步删减法。这段代码就这么多,你每减去一部分,就编译测试一下,直到你能跳出循 ...

经过鸿哥指点,我已经找到问题了问题找到了,是这里
for (y = 0;y < 8;y++)
{
            if (bInitMark)
            DisTab = PatternOneTab;
            else
            DisTab = 0x00;
}
是这个地方导致for循环无法退出,想问问为什么?

jianhong_wu 发表于 2014-11-1 10:57:19

重庆-风雪 发表于 2014-10-31 22:57
经过鸿哥指点,我已经找到问题了问题找到了,是这里
for (y = 0;y < 8;y++)
{


数组越界了。把16 - x改成15-x,因为x的最大范围是15.

重庆-风雪 发表于 2014-11-1 21:47:02

jianhong_wu 发表于 2014-11-1 10:57
数组越界了。把16 - x改成15-x,因为x的最大范围是15.

问题已解决!谢谢鸿哥!
页: [1]
查看完整版本: for循环变死循环,求大神支支招!