Paper Calc 製作過程(2)

Home PC-6001mkII Program etc

 このページでは、V1.0公開後(2007/08/18)からV1.3相当完成(2007/09/17)までを載せています。
製作過程一覧は、こちら

2007/08/18:1未満は0?
 帰省先から戻ってきてコンテストのページを見ると、評価の中に「除数が1以下の時の除算が全てゼロ除算扱いになってる」との気になる記述があった。

 さっそく試してみると、確かにゼロ除算のエラー表示になる。除算では、割る数が0か否かで分岐を行っているが、おそらくここが怪しいのだろう。という事で、この部分のみ抜き出して調べてみる。

a = 0.5
if a {mes "ゼロ以外"} else {mes "ゼロ"}

 予想に反して というか、薄々思っていた通り というか、この結果は「ゼロ」だった。数値を色々変えてみたところ、どうやら浮動小数点の場合は条件式の結果の「整数部分」が0か否かで判定をするという事がわかった。

 原因がわかれば解決は早い。以下のようにちゃんと条件式を書けば良いだけだ。

a = 0.5
if a != 0.0 {mes "ゼロ以外"} else {mes "ゼロ"}

 ちょっとサイズが増えてstart.ax のサイズが6,000バイトを超えてしまったが、仕方のないところだろう。また減量せねば。

2007/08/19:減量と追加
 今回のプログラムでは一次元の配列変数を数多く使っているのだが、この部分がサイズに大きく影響している。という訳で「初回の配列変数からの読みこみより前に同範囲に値を設定している」配列変数のみ、配列変数を省略することにする。配列変数に値設定を行った時点でHSPにより配列の自動拡張がされるので大丈夫、のはずだ。

 その他、主な減量として、月並みだが「-1」を変数にした。変数にする時点で もちろんサイズは増えるが、「-1」を使っている部分を変数に置きかえる事で1箇所あたり2バイト削減される。

 そんなこんなで、150バイトほど余裕が出来た。さて何を追加しようか。

 一般的な電卓には必ずと言って良いほど、3桁区切りの表示があるのでこれを実装しよう。幸い、3桁区切りに必要な表示桁数と小数点の位置は既に変数にあるので、これらの値を使用する事にする。

 よし、まだもう少し余裕はあるが、この辺りでコンテストの投稿を更新しよう。

2007/08/21〜22:微修正
 V1.1を出したばかりだが、結果の整数部分が16桁になる場合のエラー表示がおかしい事がわかった。
画面

 どうやら、エラー文字「E」を付けるタイミングが誤っていた影響で小数点の位置を読み誤っているらしい。という訳で軽く修正を行う。

 コンテストの方もV1.2として再更新する。この分だともう少し表示バグが出そうだなぁ。

2007/08/24:予想通り
 V1.2でも予想通りというか、表示バグがあった。ひとつは負数の整数部分3桁or6桁の時の表示で、もうひとつは「-0」表示になる場合がある事。
画面
 というわけで、さくっと修正する。並行してプログラムを見直した結果、300バイト弱の空きができたので、ちょっとした隠しを入れてみる。これでも start.axは5,848バイト。もうちょっと何か入るかな?

2007/08/25:バックスペース
 せっかく容量に余裕があるので、もう一つ付け加えるべき機能「バックスペース」を入れた。これで、入力中の数値を1桁ずつ戻せるようになった。

あともう一つ残っている問題の、Paper Calcが非アクティブになっている間もEnterやEscが効いてしまう(もちろん、stick命令のウィンドウアクティブチェックは省略値:ONになっているのだが...)件が解決したら、V1.3として公開しようか?

2007/09/08:元凶の発見
 非アクティブ時にもEscやEnterが効く元凶がようやくわかった。それは「objsel」だった。

 これが実行された時に、stick命令的にはアクティブウィンドウになったとみなされるのだろうか。とにかく一時的にウィンドウアクティブチェックが無効になるようだ。
 ...とわかった所で、常に入力ボックスにフォーカスが当たらないとだめだしなぁ。

 結局、解決策は思いつかず後日回しになる。

2007/09/16:ひとり対策会議
 9/8の原因に対して、入力ボックスを使わない方法として、onkeyを使った方法を考える。

 押したキーの情報の取得は、iParam, wParam, lParam の3種類があるようだ。まずiParamだが...なぜかテンキーのボタンを押した時に値が0になるのでNG。

 wParamだとキーボードのコードが出るようだが、これだと「+」(手元のキーボードだと、[Shift]+[;])のようにShiftキーを伴う入力がうまくいかない。第一、英語キーボードだと「+」は[Shift]+[=]になるはずで、そんなキーボードの種類ごとの処理はやってられない。これもNG。

 最後のlParamだが、出てくる値をどう解釈していいかわからないので、これもNG。

 やっぱり「objsel」を実行しない方法にするしかないか、と試しに命令を外して見ると、入力ボックス以外の部分をクリックしても入力ボックスへのフォーカスは外れない模様。ということで「objsel」を外して様子を見る。

 ...この修正が間違いだったと気づくのはまた後日の話なのだが...。

2007/09/16:Escで音が!
 このプログラムには音を出す処理がないのですっかり発見が遅くなってしまったが、Escを押すと「一般の警告音」が出る。どうやら入力ボックスにフォーカスがある時にEscキーを押すと起こる現象らしい。

 といっても、入力ボックスに常にフォーカスが当たっていないと処理が成り立たないプログラムとなっているので、こちらを今更変えるわけにも行かない。ということで「Escを押しても警告音を出さない方法」を探す。

 HSP3ラウンジで類似ケースの「inputでエンターキーを押したときの音を消したい」という項目があり、この対策部分を入れると確かに音が出なくなった。ただ、start.ax 6,000バイト制限もあり、少々処理が大きすぎるのが難点だ。

 ようするに、「Esc」の入力を入力ボックスに反映させなければいいのか?と思い、Esc入力時に一旦入力ボックスを消し、「Esc」入力後に入力ボックスを再度追加するようにした。処理の是非で言うとおそらく「非」のような気がするが、これでも音は出なくなったのでこれで突き進もうと思う。

2007/09/17:一応完成
 ボタンの四則部分は、一般的な電卓を良く見ると「÷」「×」「−」「+」の順に並んでいる。ということで、ボタンの配置を似せる事にする。
画面
 これで、一通りやろうと思っていたことはできた、のだが、もう一つやりたい事ができてしまった。これをやると、正直プログラムサイズが収まる気がしないが、とりあえずやってみてダメだったら今時点のものを出そうと思う。


製作過程(1) Paper Calc 製作過程 製作過程(3)