« TStringGrid のOnClick | メイン | ムービーのSave »

2004年12月01日

キリカ・グライト開発日誌:: なぜか消えてる・・・

    

内部ではコマンドをリストで管理している。
そして、リストをラップして、インデックスで要素を取得できるようにもしている。
で、コマンドを設定する際に、要素の数が指定したインデックスより少ない場合、push_backで空要素を追加する。

現在の要素の数より大きいインデックスよなる位置にコマンドを追加し、さらに大きいインデックスへコマンドを設定すると、なぜか前に設定したコマンドが消えていた。
おかしい。
デバッグしやすいように、リストの中身をダンプするようにするため、コマンド番号から、コマンド文字列へ変換するためのテーブルを作ろうと思ったが、面倒臭かったので、まずはOutputDebugStringで要素数などを吐かせてみることにした。
すると、要素の数が少ない。
どうやら、要素数が不足した際に追加ループの判定式が間違っていて、常に1個少なくなってしまっていたようだ。
でも、インデックスでリストから要素を取り出す時に、要素の数が少ない場合、例外を投げるようにしていたはず。
なぜ? と思ってよく見てみると、ここも間違っていた。
コードは次のような感じ。
int idx = 0;
typename std::list::iterator i = m_Items.begin();
for( ; i != m_Items.end() && idx < index; i++, idx++ );
if( idx != index )
{
throw L"Bad index.";
}
return i;
indexは、取得したい要素のインデックス番号。
idx != index の時例外としているのがまずい。
つまり、1個少ない時、i == list.end()の時は、正常だと判断してしまっていたわけだ。
これはまずいので、i == list.end()の時も例外を投げるようにした。
って、よく考えたら、idx != indexは必要ないんじゃないのか?

この部分を直したら、消えてしまう問題も解決した。ありがちだけど、アホなことをしていた。
にしても、C++Builderのデバッガは使いにくい。
何とかならないものかなぁ。



投稿者 Takenori : 2004年12月01日 11:55




comments powered by Disqus
Total : Today : Yesterday : なかのひと