#c
#c
Вопрос:
Мой метод заменяет ячейки в двойном массиве _board. После замены он устанавливает ячейку в NULL.
При следующем вызове для ячейки, для которой было установлено значение NULL, он не распознает ее как NULL.
((_board[location.getX()][location.getY()]==NULL))
И продолжает использовать метод, затем считывает мусор
Что не так?
void Board::MovePiece(Point location, Move m) throw (GameEndException, OutOfBoundsException, InvalidMoveException, NonEmptySquareException)
{
int i,j;
bool flag1,flag2;
if **(_board[location.getX()][location.getY()]==NULL)**{
InvalidMoveException IO;
throw IO;}
if ((_board[location.getX()][location.getY()]->IsValidMove(m)==false)||(_board[location.getX()][location.getY()]->getPlayerNum()!=GetTurn())) {
InvalidMoveException IO;
throw IO;}
if (_board[location.getDestination(m).getX()][location.getDestination(m).getY()]!=NULL) {
if (_board[location.getDestination(m).getX()][location.getDestination(m).getY()]->getPlayerNum()==GetTurn()){
NonEmptySquareException IO;
throw IO;}}
Point tmp=location.getDestination(m);
_board[tmp.getX()][tmp.getY()]=_board[location.getX()][location.getY()]->Clone();
delete _board[location.getX()][location.getY()];
_board[location.getX()][location.getY()]=NULL;
_lastM=m;
_lastP=location;
flag1=false;
flag2=false;
for (i=0;i<BOARD_SIZE;i ){
for (j=0;j<BOARD_SIZE;j ){
if(_board[i][j]!=NULL){
if (_board[i][j]->getPlayerNum()==ONE) flag1=true;
if (_board[i][j]->getPlayerNum()==TWO) flag2=true;
}}}
if ((flag1==false)||(flag2==false)){
GameEndException IO;
throw IO;}
}
Комментарии:
1. Боюсь, это не пройдет проверку кода.
Ответ №1:
Здесь delete _board[location.getX()][location.getY()];
вы удалили местоположение и пытаетесь получить доступ к удаленной ячейке памяти.
Комментарии:
1. Сразу после этого метод устанавливает его в NULL Кстати, он не работает даже без этой строки кода
2. Теперь в чем проблема? Можете ли вы немного уточнить, где именно вы получаете ошибку?
3. При втором запуске он попадает в ячейку, которая была удалена … и строка: _board[location.getX()][location.getY()]==NULL не соответствует действительности. он считает это ложным. но при первом запуске он устанавливает его в NULL … _board — это двойной массив указателей
4. Не удаляйте ячейку, и в вашей логике должна быть какая-то проблема, которую я не могу определить, не зная, как вы вызываете ее при первом / втором запуске и какие значения вы передаете.