отображать несколько ошибок через bool flag c ++ - PullRequest
0 голосов
/ 01 апреля 2010

Прошла долгая ночь, но застряла на этом, и теперь я получаю "ошибку сегментации" в моем компиляторе.

В основном я пытаюсь отобразить все ошибки (cout), необходимые.Если есть более одной ошибки, я должен отобразить все из них.

bool validMove(const Square board[BOARD_SIZE][BOARD_SIZE], 
               int x, int y, int value)
{
    int index;
    bool moveError = true;
    const int row_conflict(0), column_conflict(1), grid_conflict(2);    
    int v_subgrid=x/3;
    int h_subgrid=y/3;

    getCoords(x,y);

    for(index=0;index<9;index++)
        if(board[x][index].number==value){
            cout<<"That value is in conflict in this row\n";
            moveError=false;
            }

    for(index=0;index<9;index++)
        if(board[index][y].number==value){
            cout<<"That value is in conflict in this column\n";
            moveError=false;    
            }



    for(int i=v_subgrid*3;i<(v_subgrid*3 +3);i++){
        for(int j=h_subgrid*3;j<(h_subgrid*3+3);j++){
            if(board[i][j].number==value){
                cout<<"That value is in conflict in this subgrid\n";            
                moveError=false;
            }           
        }
    }
return true;
}

Ответы [ 5 ]

1 голос
/ 01 апреля 2010

Если это шахматная доска, то:

for(index=0;index<9;index++)

должно быть:

for(index=0;index<8;index++)

Или еще лучше:

for(index=0;index<BOARD_SIZE;index++)

Если у вас есть именованные константы, всегда используйте их вместо магических чисел.

0 голосов
/ 01 апреля 2010

Я ожидаю, что ваше значение seg может быть в следующем разделе ... (а также как упомянуто выше (используя 9 вместо BOARD_SIZE) для двух про-циклов for) ...

for(int i=v_subgrid*3;i<(v_subgrid*3 +3);i++){ 
    for(int j=h_subgrid*3;j<(h_subgrid*3+3);j++){ 
        if(board[i][j].number==value){ 
            cout<<"That value is in conflict in this subgrid\n";             
            moveError=false; 
        }            
    } 

Я бы порекомендовал вам написать несколько надежных тестов для таких функций, как ваша (модульные тесты).Передача значений X или Y, которые установлены в BOARD_SIZE - 2 или выше, будет означать индексацию по размеру массива платы.

То, что я пытаюсь донести, - это то, что код действительно должен быть на месте, чтобы остановить индексирование за пределами границ, надеюсь, это тоже поможет, Нил

0 голосов
/ 01 апреля 2010

1) Используйте эту функцию вместо прямой платы [x] [index] и т. Д.:

    const Square& GetSquare(
      const Square board[BOARD_SIZE][BOARD_SIZE]&,
      int x,
      int y)
    {
      assert(x >= 0);
      assert(x < BOARD_SIZE);
      assert(y >= 0);
      assert(y < BOARD_SIZE);
      return board[x][y];
    }

Проверьте, что вы находитесь на отладке, чтобы assert(false) выдало сообщение об ошибке. Напишите assert(false), посмотрите сообщение, затем удалите эту строку. Без этих утверждений я просто не могу доверять вашему коду.

2) Не используйте магические числа 9 и 3.

3) Учтите, что int v_subgrid = x / 3; может иметь ненулевой остаток, например, 7/3 = 2, а остаток равен 1. И 2/3 = 0. Если это то, что вы хотите, хорошо. Просто примите это во внимание.

0 голосов
/ 01 апреля 2010

проверьте ваши показатели. Так как вы используете массив фиксированного размера, это может быть ошибкой "по одному"

0 голосов
/ 01 апреля 2010

Чтобы узнать точную строку, которая вызывает ваш SEGFAULT, скомпилируйте с флагом -ggdb (я предполагаю, что вы используете GCC), а затем запустите вашу программу, используя gdb (используя gdb ./name_of_the_program). Когда GDB запускается, используйте run для запуска программы. Это сломается в "главном", и затем выполнит continue. Позвольте этому бежать, пока это НЕ ПОТЕРЯЕТ. После того, как произошла ошибка, выполните backtrace (или, для краткости, bt), чтобы получить обратную трассировку выполнения программы. Обратный след должен включать точную строку, которая вызвала SEGFAULT.

Имея информацию, которую вы получаете из GDB, вы сможете отладить свою программу. Однако, если вам нужна дополнительная помощь, предоставьте нам вывод backtrace, чтобы мы могли оказать вам большую помощь.

...