2017-10-27 19 views
-1

チェスボードを表すために配列を利用する「nqueens」というミニゲームを書きました。私はゲームのために5つの機能を書いています。しかし、ゲーム到達するたびに:主な機能でC++プログラムでトラップ6を打ち消す

if (checkGameEnd(board, queenNumber) == 1) { 
    if (checkResult(board) == 1) { 
     cout << "Yeah! Problem Solved." << endl; 
    } else { 
     cout << "Oops! Not enough queens." << endl; 
    } 
    break; 
} 

が、それはTRAPを中止示し(6)。私はこのフォーラムで同様の投稿を検索し、ほとんどの記事はABORT TRAPが私たちが所有していないメモリにアクセスすることに関連していると述べています。しかし、コードのどの部分が無所有のメモリにアクセスしているのか分かりません。誰もが問題を見つけることができますか?本当にありがとう。

checkGameEnd == 1にするには、I 8、K 7、J 10、L 9、B 17、A 15をゲームに入力します。

フルコード:私はGCCのaddress sanitizerを使用して、それを発見した

while (a <= N && b < N) { 
//   ** <--- here 

#include <iostream> 
#include <iomanip> 

using namespace std; 
const int N = 18; 

void printBoard(int [N][N], int); 
int getAndProcessInput(int [N][N], int&, int&); 
void flipBoard(int [N][N], int, int, int&); 
int checkGameEnd(int [N][N], int); 
int checkResult(int [N][N]); 

int main(int argc, char *argv[]) { 
    int board[N][N] = {0}; 
    int rowNumber, columnNumber, queenNumber = 0; 

    while (1) { 
     printBoard(board, queenNumber); 
     if (checkGameEnd(board, queenNumber) == 1) { 
      if (checkResult(board) == 1) { 
       cout << "Yeah! Problem Solved." << endl; 
      } else { 
       cout << "Oops! Not enough queens." << endl; 
      } 
      break; 
     } 
     while (getAndProcessInput(board, rowNumber, columnNumber) != 0){ 
      cout << "Invalid. Try again!" << endl; 
     } 
     flipBoard(board, rowNumber, columnNumber, queenNumber); 
    } 
} 

void printBoard(int board[N][N], int queenNumber) { 
    cout << " "; 
    for (int i = 65; i < 65+N; i++) { 
     char columnLetter = i; 
     cout << columnLetter << " "; 
    } 
    cout << endl; 

    for (int j = 0; j < N; j++) { 
     cout << setw(2) << j << " "; 
     for (int k = 0; k < N; k++) { 
      if (board[j][k] == 0) { 
       cout << ". "; 
      } else if (board[j][k] == 1) { 
       cout << "= "; 
      } else if (board[j][k] == 2) { 
       cout << "Q "; 
      } 
     } 
     cout << endl; 
    } 

    cout << "No. of Queens = " << queenNumber << endl; 
} 

int getAndProcessInput (int board[N][N], int& rowNumber, int& columnNumber) { 
    char column; 

    cout << "Make a move (col row): "; 
    cin >> column >> rowNumber; 

    if (column < 'A' || column > 'Z') { 
     return 1; 
    } 

    columnNumber = (int)column - 65; 

    if (columnNumber < 0 || columnNumber >= N) { 
     return 1; 
    } else if (rowNumber < 0 || rowNumber >= N) { 
     return 1; 
    } 

    if (board[rowNumber][columnNumber] != 0) { 
     return 1; 
    } 

    return 0; 
} 

void flipBoard(int board[N][N], int rowNumber, int columnNumber, int& queenNumber) { 
    int a, b; 

    board[rowNumber][columnNumber] = 2; 

    //flip in north-east direction 
    a = rowNumber - 1; 
    b = columnNumber + 1; 
    while (a >= 0 && b < N) { 
     board[a][b] = 1; 
     a--; 
     b++; 
    } 


    //flip in east direction 
    a = rowNumber; 
    b = columnNumber + 1; 
    while (b < N) { 
     board[a][b] = 1; 
     b++; 
    } 



    //flip in south-east direction 
    a = rowNumber + 1; 
    b = columnNumber + 1; 
    while (a <= N && b < N) { 
     board[a][b] = 1; 
     a++; 
     b++; 
    } 



    //flip in south direction 
    a = rowNumber + 1; 
    b = columnNumber; 
    while (a < N) { 
     board[a][b] = 1; 
     a++; 
    } 



    //flip in south-west direction 
    a = rowNumber + 1; 
    b = columnNumber - 1; 
    while (a < N && b >= 0) { 
     board[a][b] = 1; 
     a++; 
     b--; 
    } 



    //flip in south-west direction 
    a = rowNumber; 
    b = columnNumber - 1; 
    while (b >= 0) { 
     board[a][b] = 1; 
     b--; 
    } 



    //flip in north-west direction 
    a = rowNumber -1 ; 
    b = columnNumber - 1; 
    while (a >= 0 && b >= 0) { 
     board[a][b] = 1; 
     a--; 
     b--; 
    } 



    //flip in north-west direction 
    a = rowNumber -1 ; 
    b = columnNumber; 
    while (a >= 0) { 
     board[a][b] = 1; 
     a--; 
    } 


    queenNumber++; 
} 

int checkGameEnd(int board[N][N], int queenNumber) { 
    if (queenNumber == N) { 
     return 1; 
    } 

    for (int i = 0; i < N; i++) { 
     int countEqual = 0; 
     for (int j = 0; j < N; j++) { 
      if (board[i][j] == 1) { 
       countEqual++; 
      } 
     } 
     if (countEqual == N) { 
      return 1; 
     } 
    } 
    return 0; 
} 

int checkResult(int board[N][N]) { 
    int checkQueenNumber[N] = {0}; 
    for (int i = 0; i < N; i++) { 
     for (int j = 0; j < N; j++) { 
      if (board[i][j] == 2) { 
       checkQueenNumber[j] = 1; 
       break; 
      } 
     } 
    } 



    for (int k = 0; k < N; k++) { 
     if (checkQueenNumber[k] != 1) { 
      return 0; 
     } 
    } 
    return 1; 
} 
+3

すべての警告とデバッグ情報でコンパイルします。[gcc](http://gcc.gnu.org/)で 'g ++ -Wall -Wextra -g'を実行します。警告を表示しないようにコードを改善する。コードでは、標準の[containers](http://en.cppreference.com/w/cpp/container)を使用してください。 **デバッガ** gdbを使用してください。 * fix-my-code *の質問は話題にはなりません。 –

+0

あなたは 'constexpr int N = 10;' –

+0

でコードできましたあなたの提案をありがとう。私はコーディングの初心者です.GDBでデバッグすることは何も分かりません。私はそれを使って自分でデバッグを支援する方法を学びます。 – briantszhei

答えて

1

あなたがタイプミスを持っています。通常の容疑者、gdbとvalgrindはほとんど役に立たなかった。

アサーンと他のgccサニタイザはすばらしく、過小評価されているツールで、gdbとvalgrindを併用する方法を学ぶ必要があります。

+0

このエラーを指摘してくれてありがとう。コードは現在動作します。あなたの提案に従って、デバッグツールを使ってデバッグを支援する方法を学びます。本当にありがとう。 – briantszhei

関連する問題