Почему эта переменная имеет значение false? - PullRequest
1 голос
/ 07 декабря 2011

У меня есть функция, которая должна проверять возможные ответы на определенные координаты на доске судоку.Мне просто нужно, чтобы вы сосредоточились на переменной first.По какой-то причине для first установлено значение false, и я понятия не имею, почему.

Функция:

void displayPossible(int board[][9], char input[], int &row, int &col)
{
  bool first = true;                          // variable instantiated and set to true
  cout << "First " << first << endl;

  bool possible[9];                           // I dont touch `first` at all
  computeValues(board, possible, row, col);   // between these two lines..

  cout << "First " << first << endl;          // by this point it is false. WHY!?
  cout << endl;

  cout << "Possible: ";
  for(int i = 0; i < 9; i++)
    cout << possible[i];
  cout << endl;

  cout << "First " << first << endl;
  cout << "The possible values for '" << input << "' are: ";
  // if I say 'first = true' right here, i get my expected outcome
  for(int i = 0; i < 9; i++)
    {
      if(possible[i] && first == true)
        {
          first = false;
          cout << i;
        }
      else if(possible[i] && first == false)
        cout << ", " << i;

      else
        ;
    }
  cout << endl;
}

Выход:

First 1
First 0

Possible: 000010001
First 0
The possible values for 'd1' are: , 4, 8

Расчетные значения:

void computeValues(int board[][9], bool possible[], int row, int col)
{
  for(int i = 0; i < 9; i++)
    possible[i] = true;

  for(int iRow = 0; iRow < 9; iRow++)
    possible[board[iRow][col]] = false;

  for(int iCol = 0; iCol < 9; iCol++)
    possible[board[row][iCol]] = false;

  for(int iRow = 0; iRow < 2; iRow++)
    for(int iCol = 0; iCol < 2; iCol++)
      possible[board[row/3*3 + iRow][col/3*3 + iCol]] = false;

  if(board[row][col] != 0)
    possible[board[row][col]] = true;
}

Ответы [ 4 ]

4 голосов
/ 07 декабря 2011

Скорее всего, computeValues имеет переполнение буфера, которое искажает значение first.Одна очевидная возможность заключается в том, что он пишет в possible с индексом за пределами.Поскольку possible и computeValues вполне вероятно находятся рядом друг с другом в стеке, это кажется вероятным объяснением.

1 голос
/ 07 декабря 2011

computeValues должно записывать после конца одного из массивов, которые вы ему передаете (скорее всего possible). Это приводит к повреждению стека, перезаписи значения first и, возможно, к другим менее очевидным беспорядкам.

0 голосов
/ 07 декабря 2011

Возможно, из-за ошибки в possibleValues(), которая перезаписывает значение first в памяти.

0 голосов
/ 07 декабря 2011

Мне кажется, что ComputeValues ​​обращается к указателю, который (ошибочно) указывает на & first.

...