「プログラム関連(没)」の編集履歴(バックアップ)一覧に戻る
プログラム関連(没) - (2010/11/22 (月) 06:02:57) のソース
&update(j)更新 **仕様 (4/22 から新しくなったよ!!)&br() データの出力ライブラリとして、次のファイルをダウンロード・展開し、 recordable.cpp, recordable.h, app_common.h, app_common.cpp&br() をインクルードして使うこと。使い方は後述。 main.cpp, main.h はサンプルプログラム。 http://ux.getuploader.com/vipsiren/download/901/recordable_samp+ver2.zip うp時はできるだけソースコードも添付してくれると有難いぉ。 recordable.** の使い方 ① 保存したい構造体(クラス)を Recordable の派生クラスとする。 引数を持たないコンストラクタを用意する。データのロードは new で確保されたインスタンスに対し load_data を呼び出すことで行われるため、 その際のコンストラクタとして使われる。 ② クラスに必要な幾つかの設定 DEF_RECORDABLE_METHODS(クラス名) マクロをクラス定義内に記述。このマクロは Recordable::save_data, load_data, record_size のオーバーライド等を行う。 DEF_RECORDABLE_CLASS(クラス名, 識別番号) マクロを cpp ファイル内に記述。 この識別番号は異なるクラス間で重複してはならない。 ③ Recordable::save_data(GameFileWriter& fp) の実装 this をファイルにセーブする。 ここでは this の各メンバ変数 var について以下のいずれかを行う。 ・単純に値を丸コピしたいとき → fp.write(var) 配列の場合は fp.write(*var, size)。ただし size は配列のサイズ。 ・var がポインタであるとき(したがって値丸コピはまずい!!) → fp.save(var) save メソッドは Recordable* 型しか受け付けないので、 予め var の参照しているデータを Recordable の派生クラスにする(よってもちろんそのクラスについても ここに書かれていることを実行する)必要がある save メソッドでは var がまだセーブされていなければ自動的に var->save_data を呼び出す。 ・(セーブしなくても値を復元できる等の理由で)セーブする必要がないとき → なにもしない 実は、セーブするデータが this のメンバ変数である必要はない。 ④ Recordable::load_data の実装 this をファイルから読み込む。 基本的には save_data で write(x) を read(&x) に、save(x) を load(&x) に置換すれば ok ただしロードする順序は save_data でセーブした順と完全に一致させること。 save_data でセーブしなかったデータについてはここで初期化する必要がある。 ⑤ Recordable::record_size の実装 this をセーブするときのセーブデータのサイズを返す。 基本的には save_data での write(x), save(x) で書き出すサイズはそれぞれ sizeof(x), sizeof(int) ⑥実際に使う セーブ時 ① GameFileWriter インスタンスを用意 ② init(n) で作業用ヒープ領域を確保。 n は確保するヒープサイズ(大きくとりすぎても良い。必要なヒープサイズは、 セーブ対象となる各 Recordable インスタンス達について record_size() + 8) ③ save(r) で r をセーブ。r は Recordable 派生クラスのインスタンスへのポインタ。 r から参照されている他の Recordable データ達も再帰的にセーブされる。 ④ 結果のバイナリデータは pop_heap_() で取得できる。このデータは GameFileWriter のデストラクタで自動的に破棄される。 ロード時 ① GameFileReader インスタンスを用意 ② init(buff) でセーブデータを渡す。buff にはセーブ時の出力データを指定。 ③ load(&r) でデータをロード。生成されたインスタンスは r に格納される。 r から参照されている他の Recordable データ達も再帰的にロードされる。