ウィンドウ自体ではなくウィンドウを生成するゲームの状態をシリアル化する方がよいかもしれませんが、putwin
とgetwin
を使用してncursesウィンドウをシリアル化して取得することは問題ありません。
putwin
は、指定されたFILE
にウィンドウの説明を書き込むだけです。ファイルストリームを巻き戻したり、巻き戻しする必要はありません。ファイルストリームも閉じません。同様に、getwin
は、指定されたFILE
からウィンドウ記述を現在の読み取り点から読み込むだけです。
ですから、シリアル化の手順の一部としてputwin
/getwin
を使用することができます。
int serialiseWindow(Window* game, FILE* file) {
return putwin(game, file);
}
int serialiseGameState(gameState *state, FILE* file) {
int status;
status = serialiseWindow(state->game, file);
if (status != OK) return status;
status = serialisePositionArray(state->positions,
(sizeof state->positions)/(sizeof *state->positions),
file);
if (status != OK) return status;
status = serialiseInteger(state->level, file);
if (status != OK) return status;
status = serialiseInteger(state->found, file);
if (status != OK) return status;
status = serialiseIntegerArray(state->timeSpent,
(sizeof state->timeSpent)/(sizeof *state->timeSpent),
file);
return status;
}
そして、それを取り戻すために:
int retrieveWindow(Window** game, FILE* file) {
Window* win = getwin(file);
*game = win;
return win ? OK : ERR;
}
int retrieveGameState(gameState *state, FILE* file) {
int status;
status = retrieveWindow(&state->game, file);
if (status != OK) return status;
status = retrievePositionArray(state->positions,
(sizeof state->positions)/(sizeof *state->positions),
file);
if (status != OK) return status;
status = retrieveInteger(&state->level, file);
if (status != OK) return status;
status = retrieveInteger(&state->found, file);
if (status != OK) return status;
status = retrieveIntegerArray(state->timeSpent,
(sizeof state->timeSpent)/(sizeof *state->timeSpent),
file);
return status;
}
あなたの構造は、あなたがそれを初期化する場合は、動的に割り当てる必要がありますあなたの機能。次に、 'game'変数を' gameState-> game = newwin(20、50、2、2) 'または' gameState-> game = game'に割り当てます。 –
XY問題のように見えます。なぜあなたは窓を保存したいのですか?それはフロントエンドです。ゲームの状態を保存するには、バックエンドを保存する必要があります。 –
@EugeneSh。私は助言をいただきありがとうございます。 –