前回まで、コーディング時に「check」を「chek」と書いてみたり、「log」を「rog」と書いてみたりと、涙が出るぐらい美しいソースコードを奏でているS氏。 私はそんなS氏を称えたい。(今回も許可もらってるわよぉ〜)
バッファが必要
今回、ちょっとしたデータを一時的に貯めるコードが必要になりました。 まずは一通りお任せで書いてもらってもらい、辛くなってきたようであれば徐々に情報を与えつつ、その現状のコードから適当にスタックなりリングバッファなりで変形させていこうという流れを採ってみることにしました。
で、実際に作業に入ってもらったところ、まぁやっぱり詰まってしまいました。 その時のコードがこんな感じ。
int g_buttonID[10]; int g_bff_indx; int GetButtonID(int* ret) { *ret = g_nButtonID[g_bff_indx++]; return 1; } void PushButtonID(int id) { g_nButtonID[g_bff_indx++] = id; if(g_bff_indx > 10) g_bff_indx = 0; }
… g_bff_indx
「バッファのインデックスですよ!」と、解説するS氏の笑顔は大変眩しかったです。
有効なバッファの数が必要
正直、色々なところにツッコミどころはありますが、ひとつずつゆっくりと問題点を指摘し考えて修正してもらう方向でやってもらうことにしました。 でまぁ、リングバッファっぽい流れなので、そっちの方向に持っていくことにしてみます。
まず、「PushButtonID() でバッファにIDが格納されていない状態で GetButtonID() 呼んだらヤヴァイよね。」という点を指摘。
で、修正されたコード
int g_buttonID[10]; int g_buff_index; // ※直ってた int g_flag = 0; int GetButtonID(int* ret) { if(g_flag == 1) { *ret = g_nButtonID[g_buff_index++]; g_flag = 0; return 1; } else return 0; } void PushButtonID(int id) { g_nButtonID[g_buff_index++] = id; g_flag = 1; if(g_buff_index > 10) { g_buff_index = 0; g_flag = 1; } }
フラグを利用して、バッファの中が有効であるか無効であるかの判定を実現したという発想は、とりあえずは正解の方向のベクトルでしょう。*1
しかし残念ながら正解ではありません。
「連続で Push / Push / Push された後に Get しても1回しか取得できないよね。フラグを "バッファの中に有効な値が何個入ってるか?" という数値を入れるような形にしてみてはどうだろうか?」
と情報を提供し、それを聞いて何をするべきかは理解してくれた模様。 しかし、flag の代わりになる変数名が思いつかないらしい。 こういう時は和英辞典だ!!
「日本語で思いついたモノを、Yahoo!辞書とかで和英してみると良いゾ!!」
「いやーだなぁー。そんなこともうやってますよ!」
と、自信を持って見せてくれたブラウザには、こんな風に表示されていました。
姉さん。僕は今日、生まれて初めて「何も言えない」を体験しました。
*1:何でバッファ添え字が一杯になったらフラグを倒してるのかは判りませんけども…