Сегфакт при чтении структуры из файла - PullRequest
0 голосов
/ 18 января 2020

Я почти закончил игру с тральщиком в C. В настоящее время я пытаюсь реализовать функцию сохранения игры. После того, как у игрока спрашивают его имя, игра проверяет, есть ли файл с его именем. Если да, попытка загрузить файл и восстановить игровую структуру.

Я немного расширил структуру, это выглядит так:

typedef struct GAMEOBJECT {
  gamestate STATE;  ///< the current State of the game. see GAMESTATE.
  uint8_t width;    ///< width of the game board.
  uint8_t height;   ///< height of the game board.
  int  mines;       ///< the amount of mines places on the game board.
  size_t elements;  ///< total amount of cells (width*height).
  cell *cells;      ///< pointer to the start of the cell pointer array.
  player player;    ///< Structure to store Player Data;
  status status;    ///< Structure to store game infos;
} gameObject;

есть еще 3 структуры используется внутри этой конструкции:

typedef struct GAMES{
  int total;
  int won;
  int lost;
  int cells;
} games;

typedef struct STATUS{
  int moves;
  int flagged;
  int revealed;
} status;

typedef struct PLAYER {
  char name[20];
  games games;
} player;

Вопрос: - Сохраняются ли структуры внутри GameObject Structs при попытке записи структуры GameObject в файл? (Я знаю, для ячеек *, что я должен делать это отдельно, поскольку это всего лишь указатель на другую структуру.

Функции загрузки сводятся к основам:

savegameState loadGame(gameObject *Minesweeper, char *player){
        FILE *savegame = fopen(savegameName,"rb");
[...]
            //loading Gameboard from file to memory...
            size_t items_board = fread (Minesweeper, sizeof(gameObject), 1, savegame);
            //allocating memory for the Cells...
            Minesweeper->cells = (cell*)calloc(Minesweeper->elements,sizeof(cell));
            //loading cells from file to memory...           
            size_t items_cells = fread (Minesweeper->cells, sizeof(cell), Minesweeper->elements, savegame);

[...]
errorhandling

функция сохранения :

savegameState saveGame(gameObject *Minesweeper, char *player){
[...]
        FILE *savegame = fopen(savegameName,"r+b");
[...]
        size_t items_board = fwrite (&Minesweeper, sizeof(gameObject), 1, savegame); 
        size_t items_cells = fwrite (&Minesweeper->cells, sizeof(cell), Minesweeper->elements, savegame);

[...] errorhandling

попытался закомментировать сохранение для области ячейки, но все еще с ошибками ...

может быть важно, функции инициализации для основного GameObject:



  // Allocating memory for the board struct.
  gameObject *Minesweeper = (gameObject *)calloc(1,sizeof(gameObject));

  //Initing Board Parameters
  Minesweeper->width = width;
  Minesweeper->height = height;
  Minesweeper->elements = height*width;
  Minesweeper->mines = mineCount;
  Minesweeper->STATE=INIT;
  strcpy(Minesweeper->player.name,player);
  Minesweeper->cells = (cell*)calloc(Minesweeper->elements,sizeof(cell));

  if (!fromFile){
    //placing mines and getting neighboring mines.
    placeMines(Minesweeper,mineCount);
    getNeighborMines(Minesweeper); 
    revealFirst(Minesweeper);
  } else {
    Minesweeper->STATE = RESTORE;
  }

  //return struct
  return Minesweeper;
}

Если обнаружена сохраненная игра, эта функция инициализации вызывается с базовыми параметрами c (матрица 10x10, 5 мин), чтобы иметь возможность инициировать объект.

(Или я должен только инициировать GameObject? И не волнует указатель ячеек?)

...