zoukankan      html  css  js  c++  java
  • DEBUG(2)--函数的输入参数要做适当的检查

      今天在调试程序时发现,在单步运行的情况下,程序执行没有问题,但是直接运行就会出问题。出问题的代码如下

                for(int col=0;col<=9;++col)
                {
                    int killid=PositionId(row,col);
                    if(sameColor(id,killid))
                    {
                        continue;
                    }
                    if(CanMove(id,row,col,killid))
                    {
                        i_canmove++;
                        qDebug()<<"i_canmove="<<i_canmove<<endl;
                        SaveStep(id,killid,row,col,steps1);
                    }
                }
    

      其中PositionId()函数实现如下

    //返回一个位置上棋子的id,如果该位置上没有棋子,返回-1
    int DrawWidget::PositionId(int row,int col)
    {
        for(int i=0;i<32;i++)
        {
            if( (chess_man[i].row==row) && (chess_man[i].col==col) && (!chess_man[i].dead))
            {
    //            qDebug()<<"id="<<i<<endl;
                return i;
            }
        }
        return -1;
    }
    

      PositionId()的返回值在一个位置上没有棋子的情况下会返回-1

    int killid=PositionId(row,col);
    

      即killid的值有可能是-1
      sameColor()函数实现如下

    /*
     * 描述:判断两个棋子的颜色是否相同
     * 输入:待判断的两个棋子的ID
     * 输出:无
     * 返回值:false 不相同
     *        true 相同
     * 其他:无
    */
    bool DrawWidget::sameColor(int moveid, int killid)
    {
        if(chess_man[killid].red == chess_man[moveid].red)
        {
            //颜色相同
            return true;
        }
        else
        {
            //颜色不同
            return false;
        }
    }
    

    当killid值为-1时,调用

                    if(sameColor(id,killid))
                    {
                        continue;
                    }
    

      很明显,chess_man[killid].red变成了chess_man[-1].red,数组下标越界,导致程序执行出现了问题。
      修改后的sameColor()函数如下

    /*
     * 描述:判断两个棋子的颜色是否相同
     * 输入:待判断的两个棋子的ID
     * 输出:无
     * 返回值:false 不相同
     *        true 相同
     * 其他:无
    */
    bool DrawWidget::sameColor(int moveid, int killid)
    {
        if(killid == -1)
        {
            return false;
        }
        if(chess_man[killid].red == chess_man[moveid].red)
        {
            //颜色相同
            return true;
        }
        else
        {
            //颜色不同
            return false;
        }
    }
    
  • 相关阅读:
    codeforces 589G G. Hiring(树状数组+二分)
    树状数组的小总结
    virtualenv
    Redis备份与恢复
    Linux 网站相关
    MySQL文章参考
    动态执行表不可访问,本会话的自动统计被禁止 。 在执行菜单里你可以禁止统计,或在v$session,v$sesstat 和 v$statname 表里获得select权限
    app已损坏,打不开。你应该将它移到废纸篓
    macos系统用virtualbox安装Linux系统无法设
    Hadoop 分布式部署HDFS-hadoop用户部署
  • 原文地址:https://www.cnblogs.com/Manual-Linux/p/9770490.html
Copyright © 2011-2022 走看看