X作成講座 on TC(9) デバッグ
THINK C のソースレベルデバッガはX作成時に使えません。私なんかXしか作ったことが無いので、そもそもデバッガの画面を見たことが無いです(笑)
そこで、ここではTCで使えるデバッグテクニックをいくつか紹介します。非常に原始的なものですが、どうしても変数の中身を覗きたいときなどに役に立ちます。
X実行中にマックの機能を利用する
一番手軽な方法として、警告音を利用するというのがあります。ループ中に SysBeep(1); を入れてやれば、ループが何回まわったかが分かります。短い耳触りの良い警告音を用意しておくのがコツです。ある程度無音部分があった方がいいでしょう。
X実行中に HyperTalk を利用する
Xから HyperTalk を実行する手段がいくつか用意されています。これを使えば結構いろいろなことが出来ます。ただしこれらの方法はパラメータブロックのポインタ( XCmdPtr /ここでは paramPtr )が必要です。もし関数の中でこれらの方法を使うなら、XCmdPtr をグローバル変数に入れておくか、引数として関数に渡しておく必要があります。
それでは実際の例。
SendHCMessage( paramPtr, "\pset the cursor to busy" );非常に簡単ですが、SysBeep に比べて「耳が疲れない」という利点があります(笑)
SendHCMessage( paramPtr, "\pplay \"myBeep1\"" );SysBeep では警告音しか使えませんでしたが、HyperTalk を利用すれば好きな音を鳴らせます。つまり条件によって鳴らす音を変えられるということです。
SendHCMessage( paramPtr, "\pput \"*\" after msg" );実行する度にメッセージボックスに "*" を書き込みます。ループのチェックも出来るし、書き込むキャラクタによって様々な情報を伝えることも出来ます。
SendHCMessage( paramPtr, "\pshow msg" ); SendHCMessage( paramPtr, "\phide msg" );例えばあるルーチンに入ったらメッセージボックスを隠し、それを抜けたらまた表示するなんて風に使います。画面がパカパカしてうるさいですが、使い方次第ってとこですね。メニューバーやタイトルバーもこの方法で操作出来ます。
/* -- connect pascal string -- */ void pasCat( Str255 str1, Str255 str2 ){ short s; s = str2[0]; if ( str1[0] + s > 255 ) s = 255 - str1[0]; BlockMove( str2 + 1, str1 + 1 + str1[0], s ); str1[0] += s; } /* -- put number to HC messageBox -- */ void debugPutNum( XCmdPtr paramPtr, long n ){ Str255 cmd, theStr; BlockMove( "\pput \"", cmd, 255 ); NumToStr( paramPtr, n, theStr ); pasCat( cmd, theStr ); pasCat( cmd, "\p\"" ); SendHCMessage( paramPtr, cmd ); }debugPutNum 関数が今回用意したデバッグルーチンです。pasCat の方はそのためのユーティリティ。 debugPutNum 関数に paramPtr と数値を渡すとそれをメッセージボックスに表示します。例えば下のように使います。
for ( i = the_Left ; i <= the_Right ; i ++ ) { debugPutNum( paramPtr, i ); // -- bebug -- for ( s = the_Top ; s <= the_Bottom ; s ++ ) { if ( GetPixel( i, s ) ){これで、ループを回る度に変数 i の値がメッセージボックスに表示されます。ちょっと応用すれば座標を表示するルーチンとか、レクトを表示するルーチンとかも簡単に作れますね。更に
SendHCMessage( paramPtr, "\pwait until the mouse is down" );を入れてやれば、マウスクリックを待つことも出来ます。