2017-09-22 7 views
-1

私のコードはセグメンテーションフォールトを返します。私はちょうど関数initdrawをコード化し始めました。Cで15のゲームセグメンテーションエラー

これはC言語で書かれており、cs50のものです。あなたはそれがまだ終了していない見ることができるように

/** 
* fifteen.c 
* 
* Implements Game of Fifteen (generalized to d x d). 
* 
* Usage: fifteen d 
* 
* whereby the board's dimensions are to be d x d, 
* where d must be in [DIM_MIN,DIM_MAX] 
* 
* Note that usleep is obsolete, but it offers more granularity than 
* sleep and is simpler to use than nanosleep; `man usleep` for more. 
*/ 

#define _XOPEN_SOURCE 500 

#include <cs50.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 

// constants 
#define DIM_MIN 3 
#define DIM_MAX 9 

// board 
int board[DIM_MAX][DIM_MAX]; 

// dimensions 
int d; 

// prototypes 
void clear(void); 
void greet(void); 
void init(void); 
void draw(void); 
bool move(int tile); 
bool won(void); 

int main(int argc, string argv[]) { 
    // ensure proper usage 
    if (argc != 2) 
    { 
     printf("Usage: fifteen d\n"); 
     return 1; 
    } 

    // ensure valid dimensions 
    d = atoi(argv[1]); 
    if (d < DIM_MIN || d > DIM_MAX) 
    { 
     printf("Board must be between %i x %i and %i x %i, inclusive.\n", 
      DIM_MIN, DIM_MIN, DIM_MAX, DIM_MAX); 
     return 2; 
    } 

    // open log 
    FILE *file = fopen("log.txt", "w"); 
    if (file == NULL) 
    { 
     return 3; 
    } 

    // greet user with instructions 
    greet(); 

    // initialize the board 
    init(); 


    // accept moves until game is won 
    while (true) 
    { 
     // clear the screen 
     clear(); 

     // draw the current state of the board 
     draw(); 

     // log the current state of the board (for testing) 
     for (int i = 0; i < d; i++) 
     { 
      for (int j = 0; j < d; j++) 
      { 
       fprintf(file, "%i", board[i][j]); 
       if (j < d - 1) 
       { 
        fprintf(file, "|"); 
       } 
      } 
      fprintf(file, "\n"); 
     } 
     fflush(file); 

     // check for win 
     if (won()) 
     { 
      printf("ftw!\n"); 
      break; 
     } 

     // prompt for move 
     printf("Tile to move: "); 
     int tile = get_int(); 

     // quit if user inputs 0 (for testing) 
     if (tile == 0) 
     { 
      break; 
     } 

     // log move (for testing) 
     fprintf(file, "%i\n", tile); 
     fflush(file); 

     // move if possible, else report illegality 
     if (!move(tile)) 
     { 
      printf("\nIllegal move.\n"); 
      usleep(500000); 
     } 

     // sleep thread for animation's sake 
     usleep(500000); 
    } 

    // close log 
    fclose(file); 

    // success 
    return 0; 
} 

/** 
* Clears screen using ANSI escape sequences. 
*/ 
void clear(void) { 
    printf("\033[2J"); 
    printf("\033[%d;%dH", 0, 0); 
} 

/** 
* Greets player. 
*/ 
void greet(void) { 
    clear(); 
    printf("WELCOME TO GAME OF FIFTEEN\n"); 
    usleep(2000000); 
} 

/** 
* Initializes the game's board with tiles numbered 1 through d*d - 1 
* (i.e., fills 2D array with values but does not actually print them). 
*/ 
void init(void) 
{ 
    int x = 0; 
    int z = 0; 
    int y = d * d; 
    int w = 1; 
    for (x = 0; x < d; x++) 
    { 
     for (z = 0; z < d;x++) 
     { 
      board[x][z] = y - w; 
      w++; 
     } 
    } 
    board[d-1][d-1] = y; 

    if (y % 2 == 0) 
    { 
     board[d - 1][d - 2] = 2; 
     board[d - 1][d - 3] = 1; 
    } 
} 

/** 
* Prints the board in its current state. 
*/ 
void draw(void) 
{ 
    int q = 0; 
    int r = 0; 

    for (q = 0; q < d; q++) 
    { 
     for (r = 0; r < d; r++) 
     { 
      printf("|%2i|", board[q][r]); 
     } 
    } 

    if (board[q][r] == 0) 
    { 
     printf(" |__|"); 
    } 
} 

/** 
* If tile borders empty space, moves tile and returns true, else 
* returns false. 
*/ 
bool move(int tile) { 
    // TODO 
    return false; 
} 

/** 
* Returns true if game is won (i.e., board is in winning configuration), 
* else false. 
*/ 
bool won(void) { 
    // TODO 
    return false; 
} 

これは私のコードです。 私はここで少し立ち往生しています。 誰かが私がこれをどのように乗り越えることができるか知っているかもしれません。 ご協力いただきありがとうございます。

+2

理由により詳細情報の入力を求めるプロンプトが表示されています。あなたは問題の説明を提供していませんが、私たちがデバッグしたいと思っているいくつかの不完全な長いコードだけです。 –

+0

'描画'の 'if(board [q] [r] == 0)'が範囲外です: 'q == d'と' r == d'( 'd == DIM_MAX'の場合)です。 –

+0

さて、すみません。 init関数まではすべてがコード内でうまくいっているので、間違いはそこにあるはずです。それは私の最初の投稿です。私は次回よりよかったよ – zorange

答えて

3

変更for (z = 0; z < d; z++)for (z = 0; z < d; x++)、あなたはもうinit(...)でセグメンテーション違反を取得することはできません。これらのタイプのものを見つけるには、デバッガを使うだけです。 gccを使用している場合は、gdb a.outを実行してrunを実行してください。

+0

良いキャッチ!愚かなエラー... –

+0

あなたがそこに持っている素晴らしいと鋭い目です。ありがとうございました ! あなたはすごく短時間で私を助けてくれました! – zorange

関連する問題