我正在用c ++开展国际象棋比赛。 我有课程:
class piece
{
protected :
point position ;
char represent ;
bool colour; // true for player 1 = green , false for player 0 = blue
public :
virtual ~piece() ;
bool find_player(piece* to_check, int num);
char get_char() ;
bool get_colour() ;
virtual bool move_setup(point source, point dest, piece* arr[][SIZE] ) = 0 ;
virtual bool move(point source, point dest, piece* arr[][SIZE]) = 0;
bool same_player(point dest, piece* arr[][SIZE], int* num);
};
class board
{
private:
piece* arr[SIZE][SIZE] ;
public :
board();
void free_borad();
void set_piece(int x , int y , int type , bool colour );
void print_board();
void move(point source , point dest);
void set_colour(int i , int j , bool reset );
};
class pawn : public piece
{
public :
pawn(point position , bool colour );
~pawn();
virtual bool move_setup(point source, point dest, piece* arr[][SIZE]);
virtual bool move(point source, point dest, piece* arr[][SIZE]);
bool if_forward(point source, point dest);
bool if_diagonal(point source, point dest, int* offset);
};
我为每个实现移动功能的部分都有一个类。 这些类是不相关的所以我只是为这个例子放了一个pawn类。 董事会搬家职能:
void board::move(point source, point dest)
{
if (arr[source.get_x()][source.get_y()]) // if not empty
{
int x = source.get_x(), y = source.get_y() ;
if (arr[x][y]->move_setup(source, dest, arr ) ) // if the piece can move there
{
delete arr[dest.get_x()][dest.get_y()];
arr[dest.get_x()][dest.get_y()] = arr[source.get_x()][source.get_y()];
arr[source.get_x()][source.get_y()] = NULL;
std::cout << " Succes! " << std::endl;
}
else
{
// error
}
}
else // empty
{
// error
}
}
我的程序在
行崩溃了if (arr[x][y]->move_setup(source, dest, arr ) )
我已经使用VS调试器对它进行了debbuged,并意识到发送数组时发生了崩溃,错误信息:
访问冲突读取位置0xFFFFFFFF。
我试图以多种不同的方式发送它,但没有任何作用, 但这种方法完全是我的朋友如何做到的,而且对他来说效果很好。 有人可以帮忙吗? 谢谢。
答案 0 :(得分:1)
C ++中的数组是从0开始的,这意味着第一个元素的索引是0.如果您的坐标是从1开始的,则表示您正在访问数组中的一行和一列的元素。这反过来导致突破阵列和崩溃的界限。解决方案是采用基于0的坐标系,或者在访问数组时从x / y坐标中减去1。