独闷闷网

标题: for循环变死循环,求大神支支招! [打印本页]

作者: 重庆-风雪    时间: 2014-10-30 00:46
标题: 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[x][y] = PatternOneTab[0][y];
                    }
                }
                /* 后八次,从7维放到0维 */
        else
        {
            for (y = 0;y < 8;y++)
            {
                            if (bInitMark)
                {DisTab[16 - x][y] = PatternOneTab[0][y];}
                                else
                                {DisTab[16 - x][y] = 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
我教你一种调试方法,叫做逐步删减法。这段代码就这么多,你每减去一部分,就编译测试一下,直到你能跳出循环为止,那么当前被删除的那部分代码就是有bug的代码。
作者: hww5408    时间: 2014-10-30 10:50
兄弟,代码规范很重要,这样写代码发,过一段时间,你也不认识它,它也不认识你。
建议重写。
作者: 重庆-风雪    时间: 2014-10-30 20:16
jianhong_wu 发表于 2014-10-30 10:35
我教你一种调试方法,叫做逐步删减法。这段代码就这么多,你每减去一部分,就编译测试一下,直到你能跳出循 ...

好的,我试试!
作者: 重庆-风雪    时间: 2014-10-30 20:18
hww5408 发表于 2014-10-30 10:50
兄弟,代码规范很重要,这样写代码发,过一段时间,你也不认识它,它也不认识你。
建议重写。

我的代码严格按照朱老师说的去写的,确实不知道如何去优化了,兄台有何高见?
作者: 重庆-风雪    时间: 2014-10-31 22:57
jianhong_wu 发表于 2014-10-30 10:35
我教你一种调试方法,叫做逐步删减法。这段代码就这么多,你每减去一部分,就编译测试一下,直到你能跳出循 ...

经过鸿哥指点,我已经找到问题了问题找到了,是这里
for (y = 0;y < 8;y++)
{
            if (bInitMark)
            DisTab[16 - x][y] = PatternOneTab[0][y];
            else
            DisTab[16 - x][y] = 0x00;
}
是这个地方导致for循环无法退出,想问问为什么?
作者: jianhong_wu    时间: 2014-11-1 10:57
重庆-风雪 发表于 2014-10-31 22:57
经过鸿哥指点,我已经找到问题了问题找到了,是这里
for (y = 0;y < 8;y++)
{

数组越界了。把16 - x改成15-x,因为x的最大范围是15.
作者: 重庆-风雪    时间: 2014-11-1 21:47
jianhong_wu 发表于 2014-11-1 10:57
数组越界了。把16 - x改成15-x,因为x的最大范围是15.

问题已解决!谢谢鸿哥!




欢迎光临 独闷闷网 (http://dumenmen.com/) Powered by Discuz! X3.2