DATE : 2007/02/09 (Fri)
開発中の BREW アプレットのバグが取れました。
バグの発生元がなかなか分からず苦戦していたのですが、なんとかなりました。
(;´Д`)とても簡単なミスでしたが……。
開発していたのはファイルを読み込んで処理するアプレットです。レコードが50件ほどのファイルだと快調に動作します。しかし、レコードが10000件程度になると、起動してすぐにメモリの空き領域が急激になくなり、そのままアプレットが強制終了してしまいます。
BREW シミュレータにデバッガをアタッチして調べてみたところ、次の部分でアプレットが強制終了しました。(コードは分かりやすいように改変してあります)
void processData(Data& data) { ... this->add(data); if (this->isFull()) { return; } ... this->readData(); }
読み込まれたデータを add メンバ関数で追加するコードです。追加後、データを格納するバッファがいっぱいでなければ、さらにデータの読み込みを求めます(readData メンバ関数は BREW にデータの読み込みを要求するだけで終了します。その後、BREW がデータの読み込みを行う関数を呼び出します。BREW ではできるだけ早く実行環境側に処理を戻さないといけないので、ループは使っていません)。
どうも、バッファが溢れているのが原因のようです。そこで、まず add メンバ関数を調べてみます。
void add(Data& target) { this->data[this->dataCount] = target; this->dataCount++; }
あらかじめ一定数を確保しておいた配列にデータをコピーして、格納した個数を表すカウンタを増やしているだけです。
dataCount の初期値を調べてみましたが、特におかしいところはありません。dataCount の値を出力してみても、初期値は正常でした。ただ、想像したとおり、dataCount の値は配列の要素数を軽く超えていました。
すると、残るは isFull メンバ関数ということになります。しかし、isFull メンバ関数はとても簡単です。ただ単に dataCount が配列の要素数以上であれば true を返すだけです。例えば、配列の要素数が DATA_ARRAY_SIZE だとすると、次のようなコードになるはずです。
bool isFull() const { return (this->dataCount >= DATA_ARRAY_SIZE); }
( ^ω^)普通は間違えません。
しかし念のため、isFull メンバ関数を確かめてみると……。
bool isFull() const { return false; }
(゚Д゚)
(;´Д`)そういえば、前に起きたバクを直すときに、テスト用に isFull 関数の中身を消したことを忘れていました。