Почему я получаю ошибку сегментации в моем средстве проверки судоку C ++? - PullRequest
0 голосов
/ 07 мая 2020

Я на самом деле кодирую на codingame.com и получаю ошибку сегментации в моей программе, которая не имеет для меня смысла.

Я создал класс Grid, который в основном представляет собой 2D-массив из ( 9 * 9) char и несколько функций проверки.

Мой publi c check () вызывает закрытые checkLine (), checkRow () и checkSquare (). Каждый из этих трех по очереди вызывает checkNine ().

#include <iostream>
#include <string>
#include <vector>
#include <array>
#include <algorithm>

using namespace std;

class Grid
{
    public:
        Grid(string str)
        {
            for (int i = 0; i < 81; i++)
            {
                this->sudoku[i/9][i%9] = str[i];
            }
        }
        string check()
        {
            bool result = true;
            for (int i = 0; i < 9; i++)
            {
                result = result && checkLine(i) && checkRow(i);
            }
            return result ? "true" : "false";
        }
    private:
        bool checkLine(int line)
        {
            cerr << "line:" << line << endl;
            vector<char> vec;
            for (int j = 0; j < 9; j++)
            {
                vec.push_back(this->sudoku[line][j]);
            }
            return checkNine(vec);
        }
        bool checkRow(int row)
        {
            cerr << "row:" << row << endl;
            vector<char> vec;
            for (int k = 0; k < 9; k++)
            {
                  vec.push_back(this->sudoku[k][row]);
            }
            return checkNine(vec);
        }
        bool checkNine(vector<char> nine)
        {
            array<int, 9> tmp;
            tmp.fill(0);
            for(int m = 0; m < 9; m++)
            {
                tmp[nine[m - '0']] = tmp[nine[m - '0']] + 1;
            }

            return true;
        }
        char sudoku[9][9];
};

int main()
{
    string str;
    str = "123456789456789123789123456912345678345678912678912345891234567234567891567891234";

    Grid grid(str);
    cout << grid.check() << endl;
}

Как видите, я помещаю операторы cerr, чтобы попытаться увидеть, что происходит.

Когда я пытаюсь запустить программу , вот что я получаю:

Erreurs
Segmentation fault.
at new_allocator.h. function __gnu_cxx::new_allocator<char>::deallocate (this=0x7fffffffe8d0, __p=0x55565556ef50 <error: Cannot access memory at address 0x55565556ef50>) on line 128
at alloc_traits.h. function std::allocator_traits<std::allocator<char> >::deallocate (__a=..., __p=0x55565556ef50 <error: Cannot access memory at address 0x55565556ef50>, __n=18446744069414584329) on line 470
at stl_vector.h. function std::_Vector_base<char, std::allocator<char> >::_M_deallocate (this=0x7fffffffe8d0, __p=0x55565556ef50 <error: Cannot access memory at address 0x55565556ef50>, __n=18446744069414584329) on line 351
at stl_vector.h. function std::_Vector_base<char, std::allocator<char> >::~_Vector_base (this=0x7fffffffe8d0, __in_chrg=<optimized out>) on line 332
at stl_vector.h. function std::vector<char, std::allocator<char> >::~vector (this=0x7fffffffe8d0, __in_chrg=<optimized out>) on line 680
at Answer.cpp. function Grid::checkLine (this=0x7fffffffe950, line=0) on line 37
at Answer.cpp. function Grid::check[abi:cxx11]() (this=0x7fffffffe950) on line 24
at Answer.cpp. function main () on line 94
Sortie standard :
line:0
row:0

, где строка 37 - «ve c .push_back (this-> sudoku [line] [j]);»

Может ли кто-нибудь отправить меня в правильном направлении?

Edit: Sidenote, моя checkNine () не завершена, она всегда возвращает true, но дело не в этом.

1 Ответ

0 голосов
/ 07 мая 2020

Две ошибки:

bool checkNine(vector<char> nine)
{
    array<int, 9> tmp;  // <-- Too small, it has to hold 10 digits
    tmp.fill(0);
    for (int i = 0; i < 9; i++)
    {
        tmp[nine[i]] = tmp[nine[i]] + 1; // <-- Out of bounds access
    }
    return true;
}

Вектор nine содержит char значений. Эти значения char являются символьными представлениями цифр. Однако массив tmp предполагает int версии di git, а не char типы.

Короче говоря, вы (например) предполагаете, что '2' == 2, а это не так.

Таким образом, вам нужно преобразовать char в версию int:

tmp[nine[i] - '0'] = tmp[nine[i] -'0'] + 1; 

Другая ошибка заключается в том, что tmp должен содержать 10 цифр, поэтому массив слишком мал. Он должен иметь размер 10, а не 9.

    array<int, 10> tmp;  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...