SIGSEGV при сборке приложения в режиме релиза?

211
26 ноября 2016, 19:07

Проблема заключается в том что я не могу понять почему я получаю ошибку SIGSEGV. Если я собираю в режиме Debug программа работает, все хорошо, все как задумал. А вот если компилю в релиз моде, то я при работе получаю ошибку SIGSEGV.

Может я неправильно объявил двумерный массив?

Приложу то в чем я подозреваю проблему:

Вот класс mainwindow.h

// mainwindow.h
private:
int gameData[4][4];
public:
int getGameData(int x, int y);
int setGameData(int x, int y, int val);

Вот класс mainwindow.cpp

// mainwindow.cpp
void MainWindow::moveLeft(){
bool move = false;
// Сдвиг в влево
for(int x =0; x<4; x++){
    for(int y=0; y<4; y++){
        if(MainWindow::getGameData(x, y) == 0){
            for (int i = y; i < 4; i++){
                if(MainWindow::getGameData(x, i) != 0){
                    MainWindow::setGameData(x, y, MainWindow::getGameData(x, i));
                    MainWindow::setGameData(x, i, 0);
                    move = true;
                    break;
                }
            }
        }
    }
}
for(int x = 0; x<4; x++){
    for(int y = 0; y<3; y++){
        if(MainWindow::getGameData(x, y) == MainWindow::getGameData(x, y+1)){
            MainWindow::setGameData(x, y, MainWindow::getGameData(x, y)*2);
            MainWindow::scoreValuePlus(MainWindow::getGameData(x, y));
            MainWindow::setGameData(x, y+1, 0);
            move = true;
        }
        for(int x =0; x<4; x++){
            for(int y=0; y<4; y++){
                if(MainWindow::getGameData(x, y) == 0){
                    for (int i = y; i < 4; i++){
                        if(MainWindow::getGameData(x, i) != 0){
                            MainWindow::setGameData(x, y, MainWindow::getGameData(x, i));
                            MainWindow::setGameData(x, i, 0);
                            break;
                        }
                    }
                }
            }
        }
        if(MainWindow::getGameData(x, y) == 0){
            ui->gameGrid->item(x, y)->setData(Qt::DisplayRole, QVariant(""));;
        }
        else {
            ui->gameGrid->item(x, y)->setData(Qt::DisplayRole, QVariant(MainWindow::getGameData(x, y)));
        }
    }
}
if(move == true){
    MainWindow::generateCell(true);
    MainWindow::moveValuePlus();
}

Вот весь листинг кода:

mainwindow.h mainwindow.cpp

Answer 1

Для решения вопроса помогла дополнительная проверка при сложении чисел.

for(int x = 0; x<4; x++){
    for(int y = 3; y>=0; y--){
       if(y>0 && MainWindow::getGameData(x, y) == MainWindow::getGameData(x, y-1))

Всем спасибо большое!

READ ALSO
Что за значение [System process] возвращает Process32First

Что за значение [System process] возвращает Process32First

Что это обозначает и зачем оно вообще нужно? Может где то используется?

285
Почему выбивает на указанной строке?

Почему выбивает на указанной строке?

Поясните мне мою ошибку в данной функции на выделение памятиКак только доходит до строчки numb[i] = new char[50]; - сразу ошибка и в отладчике пишет...

173
Некорректный вывод после чтения файла C++

Некорректный вывод после чтения файла C++

Добрый день! У меня имеется статический метод listOfStudents() который открывает текстовый файл и считывает оттуда мои данные

195
выводит неправильные значения

выводит неправильные значения

В чем ошибка?задание вычисление функции разложения в рядво внутреннем цикле значение суммы ТЕКСТ ЗАДАНИЯ

176