2014-11-26 2 views
-2

Я пишу Sudoku solver, чтобы попрактиковаться в своих навыках для следующего семестра. Когда я пытаюсь запустить его, я получаю ошибку сегментации. Использование GDB, отслеживать его этой функции код:Segfault в sudoku solver

vector<int> sudoku::valid_set(int row, int col) 
{ 
    vector<int> valids; 
    valids.push_back(0); 

    int rows[9] = {0}, 
     cols[9] = {0}, 
     Grid[9] = {0}; 

    for (int i = 0; i < 9; i++) 
    { 
     if (i != col) 
     // we don't want to test the input cell because this 
     // will cause an incorect return 
      rows[grid[row][i] - 1]++; 
    } 
    for (int i = 0; i < 9; i++) 
    { 
     // make sure current cell is not 0 
     if (i != row) //we dont' want to test the input cell 
      cols[grid[i][col] - 1]++; 
    } 
    // do the same steps for the mini grid using integer division 
    for (int i = row/3 * 3; i < row/3 * 4; i++) 
    { 
     for (int j = col/3 * 3; i < col/3 * 4; i++) 
     { 
      if (i != row && j != col) 
       Grid[grid[i][j] - 1]++; 
     } 
    } 
    // using the three arrays, find out what 
    // values need to go into the valids vector. 
    for (int i = 0; i < 9; i++) 
    { 
     if (rows[i] == 0 && cols[i] == 0 && Grid[i] == 0) 
     { 
      int val = i + 1; 
      valids.push_back(val); 
     } 
    } 
    return valids; 
} 

Более конкретно я думаю, что ошибка происходит на линии valids.push_back(val), но я не могу за жизнь мне кажется, чтобы понять, почему. Может быть, мне не хватает чего-то явно очевидного, но я просто не знаю. Может ли кто-нибудь предложить какие-то рекомендации?

+2

В ваших начальных циклах, 'grid [row] [i] == 0'. Таким образом, ваш индекс в 'rows' становится' rows [0 - 1] ', который находится за пределами массива. –

+0

Что такое 'grid'? Отмечая разницу в 'Grid', как выделено в строке' Grid [grid [i] [j] -1] ++; '. Я предполагаю некоторый глобальный статический объект? – chrisb2244

+0

О, потому что ячейка, которая не заполнена, будет иметь значение 0, поэтому я вычитаю 1 из нее! – gsoble

ответ

1

Похоже, вы могли бы получить дополнительный код, который выполняет пограничные проверки на массивах:

for (int i = 0; i < 9; i++) 
    { 
     if (i != col) 
     { 
      if (row >= MAXIMIM_ROWS) 
       throw An_Error(); 
      int rows_index = grid[row][i]; 
      if (rows_index <= 0) 
       throw Convulsions(); 

     // we don't want to test the input cell because this 
     // will cause an incorect return 
      rows[grid[row][i] - 1]++; 
    } 

Вы должны поместить в собственной обработки ошибок, особенно потому, что параметры функции может содержать любое значение, особенно индексы вне диапазона ваших массивов.

+0

Спасибо. Это помогло решить мою проблему! – gsoble