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;
    }
}

猜你喜欢

转载自www.cnblogs.com/Manual-Linux/p/9770490.html
今日推荐