どこがおかしいかはまだ分からないが, とりあえず, 実行中のある時点で の変数の値を見て考えよう, ということはよくある. このような場合, プログラム中に print の呼び出しを入れることで値を見ることはできるが,
たとえば, 行列の積を計算するつもりで次のプログラムを書いたとしよう.
プログラム
def mat_mul(A,B) { SA = size(A); SB = size(B); if ( SA[1] != SB[0] ) error("mat_mul:size mismatch"); N = SA[0]; L = SA[1]; M = SB[1]; C = newmat(SA[0],SB[1]); for ( I = 0; I < N; I++ ) for ( J = 0; J < M; J++ ) { for ( K = 0; K < L; K++ ) T += A[I][K]*B[K][J]; C[I][J] = T; } return C; }
|
実行結果
[100] A = newmat(2,2,[[1,2],[3,4]]); [ 1 2 ] [ 3 4 ] [101] mat_mul(A,A); [ 7 17 ] [ 32 54 ]手で計算してみると, (0,0) 成分以外は全部おかしい. そこでデバッグモード に入ってブレークポイントを設定する. |
[102] debug; (debug) list mat_mul 1 def mat_mul(A,B) 2 { 3 SA = size(A); 4 SB = size(B); 5 if ( SA[1] != SB[0] ) 6 error(``mat_mul : size mismatch''); 7 N = SA[0]; L = SA[1]; M = SB[1]; 8 C = newmat(SA[0],SB[1]); 9 for ( I = 0; I < N; I++ ) 10 for ( J = 0; J < M; J++ ) { (debug) list 11 for ( K = 0; K < L; K++ ) 12 T += A[I][K]*B[K][J]; 13 C[I][J] = T; 14 } 15 return C; 16 } 17 end$ (debug)
(debug) stop at 11 (0) stop at "./mat_mul":11 (debug) quit [103] mat_mul(A,A); stopped in mat_mul at line 11 in file "./mat" 11 for ( K = 0; K < L; K++ ) (debug) print [I,J] [I,J] = [0,0] (debug)
|
とりあえず, 11 行目にブレークポイントを設定して実行してみる. 11 行目で止まったら, (0,0) 成分を表示してみる. |
(debug) cont stopped in mat_mul at line 11 in file "./mat" 11 for ( K = 0; K < L; K++ ) (debug) print [I,J] [I,J] = [0,1] (debug)
|
(0,0) 成分は正しいので, (0,1) 成分の計算まで行く. これは コマンド cont (continue) を使う. |
(debug) next stopped in mat_mul at line 12 in file "./mat" 12 T += A[I][K]*B[K][J]; (debug) print T T = 7 (debug)
|
次の行まで行く. これはコマンド next を使う. 止まったら, T の値を表示してみると, 積和計算用の変数 T が既に値を持っている. 要するに, 単なる T の初期化のし忘れだった. |
この例はあまりに人工的であるが, 使い方の雰囲気は分かってもらえると思う. なお, トレースというのは, デバッグモードに入らずに, 指定された場所で 値を表示する機能である.
(debug) trace T at 13 (0) trace T at "./mat_mul":13 (debug) quit [101] mat_mul(A,A); 7 17 32 54 [ 7 17 ] [ 32 54 ] [102]
|
13 行目にきたら, T の値を表示するように指示した. |