2016-08-23 3 views
2

私は単純なボードゲームを書いています。プログラムを実行するときに最初にやりたいことは、空のボードを印刷して、ユーザーにXYの座標を求め、入力した座標にプレーヤートークンを含むボードを印刷します。私はプログラムを実行すると、空のボードを印刷した後、X座標、その後Y座標のために私に尋ね、それは私に次のエラーを与える:ゲームボードにトークンを印刷できません

X: 1, Y: 2

Y: 2, Y: 3

Segmentation fault (core dumped)

そのエラーを作るとどのように私はそれを修正できますされてどのような?あなたがそうでなければ、これらの値は未定義であるdata[i].xCoordinatedata[i].yCoordinateを初期化する必要が

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 
#include <stdbool.h> 

struct p1Data{ 
    int xCoordinate; 
    int yCoordinate; 
    bool flag; 
}; 

char **gameBoard; 
int height, width, boardArea, xCor, yCor, dataSize, i; 

char **allocateMemory(int boardHeight, int boardWidth); 
void fillBoard(char **board, int height, int width, struct p1Data data[], int sizeData); 
void printBoard(char **board, int boardHeight, int boardWidth); 
void freeBoardArray(char **board, int boardHeight); 

int main(int argc, char** argv){ 
    height = 4; 
    width = 4; 

    boardArea = height * width; 

    struct p1Data data[boardArea]; 

    dataSize = sizeof(data)/sizeof(data[0]); 

    data[0].flag = false; 
    gameBoard = allocateMemory(height, width); 
    fillBoard(gameBoard, height, width, data, dataSize); 
    printBoard(gameBoard, height, width); 
    printf("\n"); 

    for(i = 0; i < boardArea; i++){ 
     printf("Enter X-Coordinate: "); 
     scanf("%d", &xCor); 
     printf("Enter Y-Coordinate: "); 
     scanf("%d", &yCor); 

     data[i].flag = true; 
     data[i].xCoordinate = xCor; 
     data[i].yCoordinate = yCor; 

     fillBoard(gameBoard, height, width, data, dataSize); 
     printBoard(gameBoard, height, width); 
     printf("\n"); 
    } 

    return 0; 
} 

char **allocateMemory(int boardHeight, int boardWidth){ 
    int i; 
    char **gameBoard; 

    gameBoard = (char **)malloc(sizeof(char *)*boardHeight); 

    for(i = 0; i < boardWidth; i++){ 
     gameBoard[i] = (char *)malloc(sizeof(char)*boardWidth); 
    } 

    return gameBoard; 
} 

void fillBoard(char** board, int height, int width, struct p1Data data[], int sizeData){ 
    int i, j, x, y; 

    for(i = 0; i < height; i++){ 
     for(j = 0; j < width; j++){ 
      board[i][j] = '.'; 
     } 
    } 

    if(data[0].flag == true){ 
     for(i = 0; i < sizeData; i++){ 
      x = data[i].xCoordinate; 
      y = data[i].yCoordinate; 

      board[x][y] = 'O'; 
      printf("X: %d, Y: %d\n", x, y); 
     } 
    } 
} 
void printBoard(char **board, int boardHeight, int boardWidth){ 
    int i, j; 

    printf("/"); 

    for(i = 0; i < boardWidth; i++){ 
     printf("-"); 
    } 

    printf("\\"); 

    printf("\n"); 

    for(i = 0; i < boardHeight; i++){ 
      printf("|"); 
     for(j = 0; j < boardWidth; j++){ 
      printf("%c", board[i][j]); 
     } 

     printf("|"); 
     printf("\n"); 
    } 

    printf("\\"); 

    for(i = 0; i < boardWidth; i++){ 
     printf("-"); 
    } 

    printf("/"); 
} 

void freeBoardArray(char **board, int boardHeight){ 
    int i; 
    for(i = 0; i < boardHeight; i++) 
     free(board[i]); 
    free(board); 
} 
+0

コンパイルするときは、常にすべての警告を有効にしてから、これらの警告を修正してください。ポストされたコードは、コンパイラにいくつかの警告を出力させます。 ( 'gcc'のために、最低限の使用で' -Wall -Wextra -pedantic'私は '-Wconversion -std = gnu99'も使用します)あなたを始めようとすると、' argc'と 'argv'は中古。コードはmainに対して以下のシグネチャを使用する必要があります: 'int main(void)' – user3629249

答えて

4
if (data[0].flag == true) { 
    for (i = 0; i < sizeData; i++) { 
     x = data[i].xCoordinate; //<== not intialized 
     y = data[i].yCoordinate; //<== not intialized 

     board[x][y] = 'O'; //<= x/y are undefined 
     printf("X: %d, Y: %d\n", x, y); 
    } 
} 

ありがとうございました。その後、エラーの原因となるboard[x][y]を呼び出します。この場合

//initialize here: 
for (i = 0; i < boardArea; i++) 
{ 
    data[i].flag = false; 
    data[i].xCoordinate = 0; 
    data[i].yCoordinate = 0; 
} 
fillBoard(gameBoard, height, width, data, dataSize); 
... 

あなたもゼロに初期値を設定するmemset(&data, 0, sizeof(data));を使用して初期化することができます。

メモ、2次元配列を避けてゲームを単純化することもできます。 X/Y座標と幅/高さを知ると、インデックスはx + y * widthと計算できます。または、除算と改行演算子%を使用して、1次元配列インデックスからX/Y座標を抽出します。例:

void printBoard(char *data, int w, int h) 
{ 
    int x, y; 
    for (y = 0; y < h; y++) 
    { 
     for (x = 0; x < w; x++) 
      printf("%c", data[x + y * w] ? 'O' : '.'); 
     printf("\n"); 
    } 
    printf("\n"); 
} 

int main(int argc, char** argv) 
{ 
    int width = 4; 
    int height = 4; 
    int area = width * height; 
    int i, xCor, yCor; 
    char data[area]; 
    memset(data, 0, area); 
    for (i = 0; i < area; i++) 
    { 
     printBoard(data, width, height); 
     printf("Enter X-Coordinate: "); 
     scanf("%d", &xCor); 
     printf("Enter Y-Coordinate: "); 
     scanf("%d", &yCor); 

     int index = xCor + yCor * width; 
     if (index < area) 
      data[index] = 1; 
    } 
    return 0; 
} 
+0

@ 4386427あなたは正しいです。私はそれを編集しました。 –

関連する問題