『Cプログラミング診断室』目次次(第3章 上司が問題 その他)

第3章 上司が問題

意味不明の初期化


不思議な関数が、clear_reca と clear_recbです。

  
	clear_reca()
	{
	int      i, j;

		for( i = 0 ; i < 1000 ; i++ ){
			for( j = 0 ; j < 21 ; j++ ){
				reca[i].FLG[j] = ' ';
			}
		}
	}

	clear_recb()
	{
	int      i, j;

		for( i = 0 ; i < 1000 ; i++ ){
			for( j = 0 ; j < 21 ; j++ ){
				recb[i].FLG[j] = ' ';
			}
		}
	}
さあ、clear_recaとclear_recbはどこが違うでしょうか。関数名と配列名が、それぞれ、recaと recbになっているだけで、他に違いは一切ありません。ここは、いうまでもなく、一つの関数にし てしまいましょう。

recaは構造体で、メンバー FLGの配列サイズは1なのに、なぜ for のループ回数が21なのでしょ うか。きっと、構造体の要素が全てchar型で、全て加えると21になるので21にしたのでしょう。こ れでFLGから連続した21バイトはスペースクリアされます。でも、構造体のサイズは21でしょうか? そもそも、構造体の先頭から、順に21バイトを使っているのでしょうか。構造体のサイズは、 sizeof (reca[0])とかでちゃんと調べるべきで、勝手に21と決めつけるべきではありません。

もともと1バイトしか用意していない配列FLGの添字に、範囲外の値を使うのも危険ではないでしょ うか。どうしてこれで動くかちゃんと分かってしているのならいいのですが、分からずやっている のなら大変危険なことです。

初期化は、最初にreca[0]だけをちゃんとやり、あとは構造体の代入を使えばもっと簡単です。

最後に一言。この初期化関数そのものが「無意味」なのです。データが有効になるとき、つまり、 ファイル名や日時を入れるときに、ファイル数をインクリメントし、フラグをクリアすれば十分だ と思います。用もないのに、いつも1000個の配列を、それも最悪で最低速の方法でクリアするのは 邪悪です。



Copyright1996 Hirofumi Fujiwara. No reproduction or republication without written permission
『Cプログラミング診断室』目次次(第3章 上司が問題 その他)