今日の雑記

生きることでいっぱいいっぱい

まあせっかくだから

今回の顛末をちょこっと記録しておこうと。なんか誰かの役に立つかもしれんし(たたないよ
まず、前提として以下のようなことがありました。

  • 土曜日に突然開発マシンで止まるようになった。
  • 「なんだろう?」と思いつつ、とりあえず別のマシンにコピーして動かしてみる。すると何事も無かったように動く。
  • 「えー?なにいじったっけー?」と思い返してみたが、大幅な変更をした記憶がない。

上記のプログラムは、「敵がいる方向を指し示すためのカーソル描画」の処理なんですが、これ自体は木曜に実装していて、その時は何も問題なく動いてました。描画化けとかもして無かったですし(<実はココ重要)。
大きく弄った部分は、

  • 敵との距離によってカーソルのスケールが変わるように描画することにした(上記プログラムで言うと "+ rate" の部分)。

くらいで、これだって別に問題の部分(i++)を弄ることも無いし(というか弄る意味が解らない)。
その時はまだここが原因だということは解ってなかったので、とりあえず「なにが原因で止まってるの?」という事を、まず調べることにしました。
手順というか、経緯は以下のような感じ。

  • ゲーム開始後、ちょっと経って止まる(つまりタイトルでは止まらない)。
  • ゲーム開始後に止まるというタイミングをみると、どうやら「敵出現」がキーらしい。
  • 試しに敵出現を切ると止まらない。つまり敵が原因?と思った。
  • 敵の処理を色々切るが、それでも止まる。何もしないと今度は「当たり判定」の処理の「NaN」が原因で止まる。
  • それで、最低限必要なメンバの初期値を設定するも、それでも止まる。
  • しゃーないので、メインループにデバッグ出力をかまして調べてみると「drawTsk()」で止まってる模様。
  • 「んならどのタスク描画で止まってるん?」と思ってデバッグ出力すると、 TSK_GROUP の 8 で止まってるとの事。
  • 8 ってつまり「TSKsystemDraw」(さっきのプログラムがある描画関数)だよね...。これしかないよね...?
  • 試しに描画切って見たら動いた。
  • んで、プログラムをボーっと眺めてみたら...「あっ!」
  • 解決

そもそもの原因は、最初の状態で、何故まともに動いてた(フリをしてたのか)ということだ。プログラムってると、わりとこういう「たまたま動いてます」的な現象はあるけど、今回の場合、「他のマシンでは(問題のあるバイナリだけど)動いてる」というのもあって、「えーひょっとしてボクのマシン壊れた?」なんていう考えにまで至ってしまって、まあ壊れてたのはボクのプログラムなのでよかったんですけど(というか当たり前)、逆にいうと「間違ったプログラムはその時点で間違った挙動をして欲しいなあ」と思わずにいられないというか、まあ、そうそう簡単な話ではないんですけどね。
前に話した NaN よりは単純な話なんですけど、単純なバグほど細部に宿る、といったところでしょうか。「神は細部に宿る」のです。そんなにコソコソしないで頂きたい。もっと堂々と表に出ていただきたいのです(何の話だ)。