2011-12-07 7 views
1

私は、スコークボード上のある座標への可能な答えをチェックするはずの関数を持っています。しかし、あなたは変数firstに焦点を当てる必要があります。なんらかの理由でfirstがfalseに設定されていて、なぜ私はその理由がわかりません。この変数が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; 
} 
+2

ほとんどの場合、 'computeValues'にはメモリを上書きするバグがあります。これは' should'の隣のスタック上にあるため、 'first'に影響します。しかし、 'computeValues'のコードなしで言うことは不可能です。 – Jon

+0

あなたは誤って 'computeValues'でそれを上書きしている可能性があります。可能な[]をオーバーフローさせることによって。 'computeValues'を見ることはできますか? – Rup

+0

computeValuesコードを投稿してください。 – kol

答えて

0

がComputeValように私には見えます(誤って)&を指すポインタにアクセスしています。

4

computeValuesには、firstの値が破損している可能性があります。明白な可能性の1つは、範囲外インデックスでpossibleに書き込むことです。 possiblecomputeValuesはおそらくスタック上でお互いに隣り合っている可能性が高いと思われます。

0

firstの値をメモリに上書きするpossibleValues()のバグが原因である可能性があります。

1

computeValuesは、渡した配列の終わり(おそらくpossible)を超えて書かなければなりません。これは、スタックを破損して、firstの値を上書きし、おそらく他のあまり明らかではない騒乱を引き起こします。

関連する問題