Netbeans: Appcrash во время выполнения (2d динамический массив)

0

Меня попросили сделать 2d динамический массив, размер которого равен M * M (ввод пользователя), столбец и строка имеют одинаковый размер M.

Моя проблема заключается в том, что после ввода значений M и K приложение выходит из строя.

Я не полностью понимаю конструктор и использование деструктора в динамических массивах, поэтому я думаю, что там что-то отсутствует. Любая помощь будет очень оценена! :)

#include <iostream>
#include <iomanip>
#include <new>
#include <cmath>
using namespace std;

class Board {
private:
    bool gameOver; //true if game is finished.
    int K; // number of consecutive stones needed to win.
    //int board [][];
    int M;
    int **ptr; // pointer to a pointer(**)
public:
    Board();
    ~Board();
    void getBoardSize();
    void setArrayIndex();
    void printBoard();
    int getComputerInput();
    int getPlayerInput();
    void setIndexValue(int, int);   
    };
//Constructor to initiate variables.
Board::Board(){
    gameOver = false;
    M = 0;
    K = 0;
    //board [*M][*M];
    ptr = new int*[M]; // create new array of pointers to int objects.

    for (int i=0; i < M; i++){
        ptr[i] = new int[M];
    }

}

//The destructor to release the heap memory.
Board::~Board(){ 
    for (int i=0;i<M; i++){
        delete [] ptr[i];
    }
    delete[] ptr;
}


void Board::getBoardSize(){
    cout << "Enter value for M ( > 2): " << endl;
    cin >> M;
    cout << "Enter value for K ( > 1): " << endl;
    cin >> K;
}

void Board::setArrayIndex(){

    for (int i=0; i < M; i++){
        for (int j=0; j < M; j++){
            ptr [i][j] = 0;
        }
    }
}

void Board::printBoard(){
    for (int i=0; i < M; i++){ 
        cout << setw(4) << i+1;   //Print Column numbers first.  

    }

    cout << endl; //column headers done...

    for (int r=0; r < M; r++){      
        cout << setw(2) <<r+1 << " ";
        for (int c=0; c < M; c++){

            cout << ptr[r][c]; // index values printed.
            if (c+1 < M){   //to prevent the last "---".
                cout << "---";
            }
        }
        cout << endl;
        cout << setw(4);
        for (int j=0; j < M; j++){
            if (r+1 < M){   //to prevent the last "|".
                cout << "|";
            }
            cout << "   ";  
        }
        cout << endl;
    }
}

int Board::getComputerInput(){
    int x, y;
    cout << "PC: Input row and column (x, y) from 1 to M: " << endl;
    cin >> x;
    cin >> y;
    cout << "PC Plays " << "(" << x << ", " << y << ")" << endl;
    printBoard();
    return x-1, y-1;

}

int Board::getPlayerInput(){
    int x, y;
    cout << "Human: Input row and column (x, y) from 1 to M: " << endl;
    cin >> x;
    cin >> y;
    cout << "Human Plays " << "(" << x << ", " << y << ")" << endl;
    printBoard();
    return x-1, y-1;
}

void Board::setIndexValue(int a, int b){
    //ptr [a][b] = 

}



 #endif /* NEWFILE_H */

Главный

#include <cstdlib>
#include <iostream>

using namespace std;


int main() {    
    Board object;
    object.getBoardSize();
    object.setArrayIndex();
    object.printBoard();

    //object.getComputerInput();
    //object.getPlayerInput();


    return 0;
}
  • 0
    Основной ответ заключается в том, что вам нужно инициализировать ptr в цикле, как это делается в этом вопросе: stackoverflow.com/questions/936687/… , но лучший ответ - превратить ptr в std::array<std::array<int>> так что вам не нужно иметь дело с распределением памяти (если вы можете использовать C ++ 11).
  • 0
    Привет, я сделал аналогичную инициализацию массива, используя цикл for внутри конструктора, но программа по-прежнему падает. У меня нет поддержки C ++ 11, к сожалению.
Теги:
arrays
netbeans

1 ответ

0
Лучший ответ

Во-первых, убедитесь, что вы не вводите слишком большое значение для M, так как это, безусловно, приведет к сбою программы, если недостаточно свободного места.

Во-вторых, используйте отладчик, например gdb, для запуска вашей программы. Он также должен быть доступен в Netbeans. Когда приложение выйдет из строя, он будет указывать местоположение, где оно разбилось, и тип неисправности.

Вы можете посмотреть на стек вызовов и значение переменных, чтобы найти причину сбоя.

  • 0
    Привет, спасибо за ваш вклад. Введенное значение М всегда ниже 100. Это не должно быть проблемой. Я попробовал отладчик, он говорит: «Сигнал получен: SIGSEGV (Ошибка сегментации)». Я не совсем уверен, почему это так.
  • 0
    Самая распространенная причина SIGSEGV - доступ за пределы допустимого диапазона, доступ к нулевому указателю и т. Д. Внимательно изучите трассировку стека и попытайтесь определить местоположение недопустимой операции с памятью.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню