Чтение из двойного массива указателей — NULL

#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. Не удаляйте ячейку, и в вашей логике должна быть какая-то проблема, которую я не могу определить, не зная, как вы вызываете ее при первом / втором запуске и какие значения вы передаете.