忍者ブログ

[PR]

2024年04月24日
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

ねんまつー

2008年12月28日


http://blog.cnobi.jp/v1/blog/user/facb69965cc0e2aa2ab0d154650d346a/1230430994

年末ですね。
自分も実家に戻ります。

画像素材も大体終わったので、スクリプト作業は実家でも出来そうです。
年始あたりで体験版公開したい。

システム的にはGuardとリプレイを実装。
リプレイは、進行速度が可変なゲームなのでかなり迷ったのですが、
早送り機能をつけることや、メニュー中の未操作時間をある程度スキップさせることで
一応解決を図りました。

//-----------------------------------------------------------------------

それと、コンパイルの問題なのかちょっと分かりませんが、プログラムで
ちょっとしたトラブルがあったので、同じ問題に悩んでいる方は参考にしてください。

自分はゲーム中でリストを管理する場合、テンプレートに雛形を作ってそれを継承しています。
以下のような感じで

template<class BS> class cList{
public:
 BS  *before,*next,*head,*tail;
 short   num;  //要素数
 bool   reffered; //参照

 cList();
 virtual ~cList();
 void PushIn(BS *p};  //リストに挿入
 void Pop(BS *p);     //リストから外す(消さない)
 void PushOut(BS *p); //リストから消去
 void AllClear(void);   //リストを全て消去
 void CleanUp(void); //参照のない要素を消去
 void ZSort(void);    //リストをソート
 BS * ExChange(BS *p,BS *q);//要素の入れ替え
 virtual bool Compared(BS *p,BS *q); //要素の比較
};

で、リプレイ記録用に、以下のようなリストを定義したところ、コンパイルは問題ありませんでしたが
デバック中に「ヒープが壊れている」といったエラーが出てきました。

class cReplayList : public cList<cReplayList>{
public:
 cReplayFlm   dat[128];

 cReplayList(){}; ~cReplayList(){};
};

調べてみるとリストでPushOutなどを呼び出し、deleteしようとすると駄目らしいです。
でもリストは他のところでも色々使っているしヒープが壊れるようなことはやってねぇ!
と色々試してみた結果

class cReplayList : public cList<cReplayList>{
public:
 cReplayFlm   dat[127];
 short    id;

 cReplayList(){}; ~cReplayList(){};
 void set(void){ id=0; };
};

こんな感じに、メンバ変数を2つにしてダミー関数を入れてみたら何故かエラーが消えました。
推測ですが、テンプレートクラスを継承した場合、継承先のデータが単純な構造だと
これをクラスではなく構造体、もしくはただの配列として認識しているようです。
それで継承したクラスのデータサイズに誤差が生じ、ヒープが壊れているとエラーが出てしまうと。
実際はどうなのか分かりませんが。

自分がこれを調べたとき、該当するような解説が見当たらなかったので一応書いてみました。

PR
Comment
  Vodafone絵文字 i-mode絵文字 Ezweb絵文字
Trackback
トラックバックURL: