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" );
 例えばあるルーチンに入ったらメッセージボックスを隠し、それを抜けたらまた表示するなんて風に使います。画面がパカパカしてうるさいですが、使い方次第ってとこですね。メニューバーやタイトルバーもこの方法で操作出来ます。

 ここまでは1行で出来る簡単なものでしたが、変数の中身を調べたい時にはもう少し複雑な方法を採ります。下記のようなデバッグルーチンを用意しておくと便利でしょう。

/* -- 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" );
を入れてやれば、マウスクリックを待つことも出来ます。


 どうでしょうか。 HyperTalk を併用することで、結構バリエーションに富んだデバッグが出来るようになります。 HyperTalk さえ利用出来るんならこっちのもんですよね。ボタンやフィールドだって使えますから、変数の値を連続してフィールドに書き出すなんて芸当も出来ます。是非挑戦してみて下さい。


inserted by FC2 system
Next



THINK C Lab.

UDI's HomePage