listによるバグ。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
KKXY

listによるバグ。

#1

投稿記事 by KKXY » 15年前

listを使ったクラスでバグが起きました。
一体何故バグになるのかわかりません。
なにとぞご教授お願いします。

以下ソースコード
template <class type>
class Graphics
{
protected:
std::list<type*> dezid;
std::list<type*> dezid;
public:
void add(type* bb)
{
std::list<type*>::iterator p_one=dezid.begin();
std::list<type*>::iterator p_two=dezid.end();
if(dezid.size()!=0)
{
p_two--;
}
if( dezid.size()==0 || (bb->get_z() < (*p_one)->get_z() )){
if(bb->get_z()!=-1){
dezid.push_front(bb);//dezidにbbをいれる
}
}
else if( bb->get_z() >= (*p_two)->get_z() ){

if( bb->get_z()!=-1 ){
dezid.push_back(bb);//dezidにbbをいれる。
}
}
else{
while((*p_one)->get_z() <= bb->get_z()
&&
p_one!=dezid.end())
{
p_one++;
}
dezid.insert(p_one,bb);//dezidにbbをいれる
}
};
void clear(){
dezid.clear();
};
void dispose(type* bb)
{
std::list<type*>::iterator p_one=dezid.begin();//add関数でdezidにadd関数を使って
                             データを入れた場合、
                             ブレークポイントを使って調べると
                             ちゃんとデータが入っていると出る。
std::list<type*>::iterator p_two=dezid.end();
if(dezid.size()!=0)
{
p_two--;
}

if( dezid.size()==0){
}
else if(bb == (*p_two)){
dezid.erase(p_two);
}
else if( bb ==(*p_one)){
dezid.erase(p_one);
}
else{
while(1)
{
if (p_one==dezid.end())
{
break;
}
if (bb == (*p_one))
{
dezid.erase(p_one);
break;
}
p_one++;
}
}
};
void screen_up()
{
std::list<type*>::iterator p_one=dezid.begin(); //ブレークポイントで調べるとadd関数でちゃん                             とデータをいれたはず
                             なのにdezidには何も入っていないと出る。
std::list<type*>::iterator p_two=dezid.end(); //ブレークポイントで調べるとadd関数でちゃん                             とデータをいれたはず
                            なのにdezidには何も入っていないと出る。

ClearDrawScreen(); // 裏画面のデータを全て削除
SetDrawScreen( DX_SCREEN_BACK );

for(p_one;p_one!=dezid.end();p_one++){
if( (*p_one)->get_visible()==true )
(*p_one)->draw();
}
ScreenFlip();//裏画面を表画面に反映
};
};
static Graphics<Bitmap> graphics;

今回は同様のバグを掃くソースを作ることが出来ず、
バグを起こしているソースをそのまま移しました。

このバグは簡単に言うと
「list型のメンバー変数であるdezidにデータを入れたはずなのに
 メンバー関数で使うと何も入っていないことになっている。」
というバグなのです。
しかもadd関数とdispose関数の中でdezidを使い、
ブレークポイントを使って調べたら
ちゃんとdezidにはデータが入っていることになっているのです。
一体何故このようなバグがおきるのでしょうか?
ちなみにdezidと同じ名前のグローバル変数は宣言していません。

Ma

Re:listによるバグ。

#2

投稿記事 by Ma » 15年前

しっかり検証していませんが、ぱっとみ気になった点。

protected:
std::list<type*> dezid;
std::list<type*> dezid;

同じ名前のメンバーが宣言されていますが、これはミスでしょうか?
というか、これでコンパイルできるのでしょうか。。

KKXY

Re:listによるバグ。

#3

投稿記事 by KKXY » 15年前

すみません、ミスです

KKXY

Re:listによるバグ。

#4

投稿記事 by KKXY » 15年前

すみません、自己解決しました。

閉鎖

“C言語何でも質問掲示板” へ戻る