日本-日本語 |
|
|
|
OpenVMS マニュアル |
|
HP OpenVMS
|
目次 | 索引 |
2.5.2 シンボルのあいまいさの解消 |
シンボルのあいまいさは,シンボル ( たとえば,変数名 X) が 2 つ以上のルーチン内または他のプログラム単位内で定義されているときに起こります。
ほとんどの場合,デバッガはシンボルのあいまいさを自動的に解消します。最初に,現在設定されている言語の有効範囲および可視性規則が適用されます。さらに,デバッガは,任意のモジュール内のシンボル指定を許可しているため ( ブレークポイントを設定するときなど ),呼び出しスタック上の呼び出しルーチンの順序で,シンボルのあいまいさを解消します。
シンボルのあいまいさを解消できない場合,デバッガは次のようなメッセージを発行します。
DBG> EXAMINE Y %DEBUG-W-NOUNIQUE, symbol 'Y' is not unique DBG> |
このような場合は,そのシンボルの宣言を一意に指定するために,パス名接頭識別子を使用します。最初に,SHOW SYMBOLコマンドを使用して,そのシンボルに対応する ( そのシンボルのすべての宣言に対応する ) すべてのパス名のうち,現在 RST にロードされているものを確認します。そして,必要なパス名接頭識別子を使用して,シンボルを参照します。次に例を示します。
DBG> SHOW SYMBOL Y data MOD7\ROUT3\BLOCK1\Y data MOD4\ROUT2\Y DBG> EXAMINE MOD4\ROUT2\Y MOD4\ROUT2\Y: 12 DBG> |
Y の特定の宣言を繰り返して参照する必要がある場合は,SET SCOPE コマンドを使用して,シンボル検索用に新しい省略時の有効範囲を設定します。新しい有効範囲を設定したあと,パス名接頭識別子を指定しないで Y を参照すると,新しい有効範囲内で見える Y の宣言が使用されます。次に例を示します。
DBG> SET SCOPE MOD4\ROUT2 DBG> EXAMINE Y MOD4\ROUT2\Y: 12 DBG> |
シンボル検索用の現在の有効範囲を表示するには,SHOW SCOPE コマンドを使用します。省略時の有効範囲を復元するには,CANCEL SCOPE コマンドを使用します。
この節では,論理エラーを含む FORTRAN プログラム ( 例 2-1 を参照) を例に,デバッグ・セッションの概要を示します。この例には,本文の説明で参照されているソース行を識別できるよう,コンパイラ割り当て行番号が含まれています。
SQUARES という名前のこのプログラムは,次の機能を持っています。
2.6 デバッグ・セッションの例
例 2-1 サンプル・プログラムSQUARES |
---|
1: INTEGER INARR(20), OUTARR(20) 2: C 3: C ---データ・ファイルから入力用の配列を読み込む 4: OPEN(UNIT=8, FILE='DATAFILE.DAT', STATUS='OLD') 5: READ(8,*) N, (INARR(I), I=1,N) 6: C 7: C ---すべてのゼロ以外の要素を2乗してOUTARRに格納する 8: K = 0 9: DO 10 I = 1, N 10: IF(INARR(I) .NE. 0) THEN 11: OUTARR(K) = INARR(I)**2 12: ENDIF 13: 10 CONTINUE 14: C 15: C ---2乗された出力値をプリントし,終了する 16: PRINT 20, K 17: 20 FORMAT(' Number of nonzero elements is',I4) 18: DO 40 I = 1, K 19: PRINT 30, I, OUTARR(I) 20: 30 FORMAT(' Element',I4,' has value',I6) 21: 40 CONTINUE 22: END |
SQUARES を実行すると,データ・ファイル内のゼロ以外の要素の数に関係なく,次のようなメッセージが出力されます。
$ RUN SQUARES Number of nonzero elements is 0 |
このプログラムのエラーは,OUTARR 内の現在のインデックス値を保持している変数 K が,9 行目から 13 行目までのループ内で増分されていないことです。11 行目の直前に K = K + 1 という文を挿入しなければなりません。
例 2-2 に,デバッグ・セッションの開始方法とデバッガを使用してエラーを発見する方法を示します。例のあとに,各番号に対応する説明があります。
例 2-2 プログラムSQUARESを使用したデバッグ・セッション例 |
---|
$ FORTRAN/DEBUG/NOOPTIMIZE SQUARES (1) $ LINK/DEBUG SQUARES (2) $ DEBUG/KEEP (3) Debugger Banner and Version Number DBG> RUN SQUARES (4) %DEBUG-I-INITIAL, language is FORTRAN, module set to SQUARES$MAIN DBG> STEP 4 (5) stepped to SQUARES$MAIN\%LINE 9 9: DO 10 I = 1, N DBG> EXAMINE N,K (6) SQUARES$MAIN\N: 9 SQUARES$MAIN\K: 0 DBG> STEP 2 (7) stepped to SQUARES$MAIN\%LINE 11 11: OUTARR(K) = INARR(I)**2 DBG> EXAMINE I,K (8) SQUARES$MAIN\I: 1 SQUARES$MAIN\K: 0 DBG> DEPOSIT K = 1 (9) DBG> SET TRACE/SILENT %LINE 11 DO (DEPOSIT K = K + 1) (10) DBG> GO (11) Number of nonzero elements is 4 Element 1 has value 16 Element 2 has value 36 Element 3 has value 9 Element 4 has value 49 %DEBUG-I-EXITSTATUS, is 'SYSTEM-S-NORMAL, normal successful completion' DBG> SPAWN (12) $ EDIT SQUARES.FOR (13) . . . 10: IF(INARR(I) .NE. 0) THEN 11: K = K + 1 12: OUTARR(K) = INARR(I)**2 13: ENDIF . . . $ FORTRAN/DEBUG/NOOPTIMIZE SQUARES (14) $ LINK/DEBUG SQUARES $ LOGOUT (15) DBG> RUN SQUARES (16) %DEBUG-I-INITIAL, language is FORTRAN, module set to SQUARES$MAIN DBG> SET BREAK %LINE 12 DO (EXAMINE I,K) (17) DBG> GO (18) SQUARES$MAIN\I: 1 SQUARES$MAIN\K: 1 DBG> GO SQUARES$MAIN\I: 2 SQUARES$MAIN\K: 2 DBG> GO SQUARES$MAIN\I: 4 SQUARES$MAIN\K: 3 DBG> EXIT (19) $ |
次の説明は, 例 2-2 内の番号に対応しています。 例 2-1 は,デバッグ中のプログラムを示しています。
目次 | 索引 |
|