Small Basicのプログラムを作っていると、下記のようなランタイムエラー(実行時のエラー)が表示されることがあります。
【図64 Small Basic 実行時のエラー「Decimal型の値が大きすぎるか、または小さすぎます。」】
ぱっと見、なんのことか分かりません。Small Basicのプログラムの何行目のどの命令がおかしいのか、直接的には書かれていないからです。
しかし、このメッセージをよく見るとエラーの原因が見えてきます。メッセージの下にあるテキストボックスには、「場所」の情報が記されています。これはSmall Basicのソースプログラムを実行形式に変換(コンパイル)した後のルーチン名がエラーを起こした場所から過去に遡って表示されたものです。ある変数の値が大きすぎるか小さすぎるということが原因で計算できなくなったのは一番上のSystem.Decimal..ctor(Double value)という処理の中です。.. とピリオドが2つ並んでいるところは、名前が長いので省略されている可能性があります。その呼び出し元は、その下の行のMicrosoft.SmallBasic.Library.Math.ArcSin(Primitive sinValue)で、Small BasicのMath.ArcSin()というMathクラスの操作です。正弦関数の逆関数sin-1です。sin-1の引数は-1から+1までの範囲なので、この範囲を超えた引数を与えてしまった可能性があります。
Math.ArcSin()の呼び出し元はastron_alphatoarea()です。実際、Math.ArcSin()の引数をその1つ前のステップでTextWindow.WriteLine()を使って表示してみたところ、やはり1より大きい数になっていました。分母と分子を逆に計算していたため1より大きくなっていました。
このように、一見分かりにくいSmall Basicのランタイムエラーも、よく見ると解決の糸口が隠されています。
和時計プログラムは現在日の出・日の入り時刻の処理についてデバッグ中です。
(つづく)