今天在调试程序时发现,在单步运行的情况下,程序执行没有问题,但是直接运行就会出问题。出问题的代码如下
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="<<
其中PositionId()函数实现如下
//返回一个位置上棋子的id,如果该位置上没有棋子,返回-1int 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="<<
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; }}