2017-07-05 14 views
0

私は、次の構造体があります。私はgameState.gameのncursesウィンドウに保存することができますどのようにncursesウィンドウを構造体に保存する方法は?

typedef struct gameState { 
    WINDOW *game; 
    character *player; 
    finalPosition positions[5]; 
    int level, found, timeSpent[3]; 
} gameState; 

を?

これは私がウィンドウを作成した方法です。

WINDOW * game = newwin(20, 50, 2, 2); 

私は私の問題は、おそらくポインタの問題だと思う、私は構造体へのポインタを保存しようとしていると私はこのポインタを作成した機能を残すたび、それはポインタが指すの内容を削除します。

最終的な目的は、構造体全体をバイナリファイルに保存することです。私はncursesがバイナリファイルにウィンドウを保存するputwin()関数を持っていることを知っていますが、この構造体の残りの内容を同じバイナリファイルに保存する必要があるので、putwin()は解決しません私の問題。

+0

あなたの構造は、あなたがそれを初期化する場合は、動的に割り当てる必要がありますあなたの機能。次に、 'game'変数を' gameState-> game = newwin(20、50、2、2) 'または' gameState-> game = game'に割り当てます。 –

+1

XY問題のように見えます。なぜあなたは窓を保存したいのですか?それはフロントエンドです。ゲームの状態を保存するには、バックエンドを保存する必要があります。 –

+0

@EugeneSh。私は助言をいただきありがとうございます。 –

答えて

0

ウィンドウ自体ではなくウィンドウを生成するゲームの状態をシリアル化する方がよいかもしれませんが、putwingetwinを使用して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; 
} 
関連する問題