2009.01.23 (Fri)
■ [雑記] また日が空きました。
相変わらず残業三昧……というわけではなく、今度は普通にゲーム三昧してました。えへへ!
仕事の山場は概ね越えたので、定時で帰れるようになりました。もう不具合は出るまい……出ても無視りたい。仕様だとつっぱねたい。いやそれやると癌砲になりますね、はい。
■ [PG] 変数・メンバの初期化
当方がメインに触ってるのは C/C++ なのでそれが基準のお話です。今回仕事で一緒にコーディングしてる人のコードがあまりにも杜撰すぎたので、ここでぼやきついでに。
変数は宣言したら必ず初期化する。
これはもう世界の常識だと思うんですが、どうもそこまで重要に思ってない人が居るようで。今回仕事で、これを忘れた部分が多すぎたお陰で丸一日以上をムダにさせられました。逆を言えば、これをちゃんとしてればムダなデバッグ時間を削減できるとも言えるわけで。
例えばこんなコードがあったとする。GetCount関数(どっかで実装しておく)で、別の場所で保持しておいた値を拾ってきて、値が100より大きかったら「OK!!」を、そうでなければ「NG!!」を出力するという、ごくごく簡単なコードです。
int n;
GetCount(&n);
if (n > 100) {
printf("OK!!\n");
}
else {
printf("NG!!\n");
}
この関数で例えば10が返ってくれば単純に「OK!!」と表示されるわけですが、もしこの関数の中で値を返さなかった場合に、これは「OK!!」と表示されるのか「NG!!」と表示されるのかという話です。
変数ってのは宣言するとメモリのスタック領域またはレジスタを確保して、そのメモリをスコープ内で自由に使うぞって意味です。変数は宣言しても初期化されるとは限らず、不定値が入ってるわけです。
つまりここでは「どっちが表示されるかわからん」という話になります。これは酷い話で、例えばコンパイラによってどっちに流れるか変わるし、コンパイルオプション(最適化、デバッグ情報など)によっても大きく変わります。具体例を挙げれば、いわゆる VC で Debug モードか Release モードかというだけで値が変わります。
「GetCound関数がエラーだったら、ランダムに表示されるよ!」なんてふざけた仕様が、少なくとも公開するプログラムで許されるわけがありません。そんなのが許されるのは神がサイコロを振ったときくらいなものです。
今回は一緒にコーディングしてる人が半数近くの変数に対して初期値を入れてなかったもんだから、もはや何処が原因だか判らない上に、そもそもこんなものが原因だなんて思いたくもないという心理的なアレでソレもあるわけです。
こうした小さな手抜き*1が大きなバグを生むのが、プログラミングの世界です。バグを生むのは一瞬。しかしこのバグを発見するのに1日かけたりするんですから、馬鹿馬鹿しい話です。それで無駄な時間を要して「残業代増えたー」なんて喜ぶ訳がありません。いいから帰ってゲームさせろ。
今週一週間をダイジェストでお送りしました。
*1 とは言っても他の言語では宣言したら0にリセットされるのもあるかもしれませんが、当方はC/C++くらいしかやったことないので知りません。
■ [Game] ジルオール∞+(1)
学生時代に「TRPGくさい名作」という風評を聞いていたジルオールの、PSP移植版。フリーシナリオにマルチエンド、クエスト受注して世界を旅する冒険者、宝箱を開けるのにもスキルとステータスが必要、MPが無くなれば気絶する……などなど、いわゆる硬派で正統派な RPG です。
が。ごろつきに絡まれてた酒場のウェイトレスさんを助けたらその娘が主人公に惚れ込んでしまい、主人公が神器を探して旅をしていると言うと、昔おばあちゃんから聞いたドワーフとエルフが力を合わせた伝説のフライパンもその神器のひとつだと嘘をついて付いてきてしまい、それでも主人公の側に居たいがためにその嘘を突き通しながら一緒に伝説のフライパンを探して旅をする……とかなんか変な話になってきてます。
いやはや、確かにこの硬派なファンタジーでこれを平然とやってのけるのは確かに名作と呼ばざるを得ない! いや勿論これだけでそう判断しているわけではないですけどね? 普通に面白いですよ?
しかも当方はアレです、主人公の性別を女にしてるんでこのシチュは色々とですね。
いやあ、ジルオール楽しいなあ! こんな展開になるなんて全く予想外だったけど!