「プログラム関連(没)」の編集履歴(バックアップ)一覧はこちら
「プログラム関連(没)」(2010/11/22 (月) 06:02:57) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
**仕様
(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 データ達も再帰的にロードされる。
&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 データ達も再帰的にロードされる。
表示オプション
横に並べて表示:
変化行の前後のみ表示: