独闷闷网

 找回密码
 立即注册
搜索
查看: 6455|回复: 7
打印 上一主题 下一主题
收起左侧

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

[复制链接]
跳转到指定楼层
楼主
发表于 2014-10-30 00:46:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
虽然我知道看代码很蛋疼,但是实在没办法,求大家帮帮忙!
问题就是程序在执行下面这个子函数的时候一直循环,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++;
                        }
                }
    }
}

乐于分享,勇于质疑!
沙发
发表于 2014-10-30 10:35:50 | 只看该作者
我教你一种调试方法,叫做逐步删减法。这段代码就这么多,你每减去一部分,就编译测试一下,直到你能跳出循环为止,那么当前被删除的那部分代码就是有bug的代码。
乐于分享,勇于质疑!
板凳
发表于 2014-10-30 10:50:55 | 只看该作者
兄弟,代码规范很重要,这样写代码发,过一段时间,你也不认识它,它也不认识你。
建议重写。
乐于分享,勇于质疑!
地板
 楼主| 发表于 2014-10-30 20:16:57 | 只看该作者
jianhong_wu 发表于 2014-10-30 10:35
我教你一种调试方法,叫做逐步删减法。这段代码就这么多,你每减去一部分,就编译测试一下,直到你能跳出循 ...

好的,我试试!
乐于分享,勇于质疑!
5#
 楼主| 发表于 2014-10-30 20:18:01 | 只看该作者
hww5408 发表于 2014-10-30 10:50
兄弟,代码规范很重要,这样写代码发,过一段时间,你也不认识它,它也不认识你。
建议重写。

我的代码严格按照朱老师说的去写的,确实不知道如何去优化了,兄台有何高见?
乐于分享,勇于质疑!
6#
 楼主| 发表于 2014-10-31 22:57:15 | 只看该作者
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循环无法退出,想问问为什么?
乐于分享,勇于质疑!
7#
发表于 2014-11-1 10:57:19 | 只看该作者
重庆-风雪 发表于 2014-10-31 22:57
经过鸿哥指点,我已经找到问题了问题找到了,是这里
for (y = 0;y < 8;y++)
{

数组越界了。把16 - x改成15-x,因为x的最大范围是15.
乐于分享,勇于质疑!
8#
 楼主| 发表于 2014-11-1 21:47:02 | 只看该作者
jianhong_wu 发表于 2014-11-1 10:57
数组越界了。把16 - x改成15-x,因为x的最大范围是15.

问题已解决!谢谢鸿哥!
乐于分享,勇于质疑!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|独闷闷网 ( 粤ICP备12007667号-2 )

GMT+8, 2024-11-29 16:29 , Processed in 0.212436 second(s), 17 queries .

快速回复 返回顶部 返回列表