どこがおかしいかはまだ分からないが, とりあえず, 実行中のある時点で の変数の値を見て考えよう, ということはよくある. このような場合, プログラム中に 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 の値を表示するように指示した. |