久しぶりに Windows で C プログラミングする

久々に Windows の Visual C++ でプログラミングした。 しかも C++ ではなしに C でコンソールアプリケーションである。 MFCSTL もなしに文字列と配列を扱わなければならないというのにはちょっとめまいがした。 まあ、 ばりばり配列を使わなければならないというわけでもないのだが、 少なくとも二つの配列が必要になった。 仕方がないので……というよりも喜々として、 StringArray なんて構造体を定義して、 簡単な動的配列クラスをでっち上げてしまった。

そういえば一昔くらい前にネットで公開した C で作ったプログラムでも 可変長のコンテナを使っていたよな、 と思い出してダウンロードしてみたら配列ではなくてリストだった。 この頃は iTRON 用のプログラムを Windows 上でテストしなければならなかったので、 POSIX C でコンパイル、 というか Cygwingccコンパイルできるテスト自動化ツール & ライブラリを作ったのだった。 JUnit とか CppUnit を参考にしたンであるが。 しかしまあ今回は使わないことにした。 繰り返し配列の要素にアクセスしなければならないので、 イテレータを書いたり、 イテレータで書いたりするのが大変そうだから。

ちなみに構造体でラップした動的配列は、 容量が足りなくなるごとに 2 倍のサイズで realloc するようにした。 まあ固定サイズで伸長するようにしないのは趣味の問題かな。 とはいえ 「動的配列への追加コストはなぜ O(1)?」 とか、 「http://www.kmonos.net/wlog/111.html」 という話もあるようなんだけど……。

くだらないミス

あまりにも久しぶりだったため、 あまりにもくだらないミスを二つしてしまった。

一つは、 strcmp の戻り値をチェックしなかった。

if (strcmp(argv[optind], "--"))
  { ... }
初心者がよくやるミスだ。 なさけない。

もう一つは、

fprintf(STDERR, "error message...\n");
STDERR が未定義エラーになって慌てたこと。

どう考えてもスペルミスとは思えないし、 STDINSTDOUTSTDERR だよな、 <stdio.h> もインクルードしているし……。 としばらく悩んで天啓がおりてきた。

stderr じゃん!