日本-日本語 |
|
|
|
OpenVMS マニュアル |
|
HP OpenVMS
|
目次 | 索引 |
GOSUB |
コマンド・プロシージャ・レベルを変更せずに,制御をコマンド・プロシージャ内のラベルが付けられたサブルーチンに渡します。
GOSUB ラベル
ラベル
コマンド行の最初の項目として, 1 文字から 255 文字までの英数字のラベルを指定します。ラベルの中にブランクを含むことはできません。 GOSUB コマンドの実行後,制御は指定されたラベルのあとのコマンドに渡されます。ラベルは,現在のコマンド・プロシージャの中で, GOSUB ステートメントの前でもあとでもかまいません。コマンド・プロシージャ内でラベルを使用する場合には,最後にコロンを指定しなければなりません。ラベルが重複している場合,最も最近読まれたラベルへ飛びます。
ラベルで指定されたサブルーチンへ制御を移すには,コマンド・プロシージャで GOSUB コマンドを使用します。コマンド・ストリームをランダム・アクセス装置 ( つまりディスク装置 ) から読み取っていないと,GOSUB コマンドは動作しません。RETURN コマンドは,GOSUB サブルーチン・プロシージャを終了させ, GOSUB 文の呼び出しの次のコマンドへ制御を移します。 RETURN コマンドは,省略可能な状態値を受け付けます。
GOSUB コマンドでは,新しいプロシージャ・レベルは生成されません。したがって,これを "ローカルの" サブルーチン呼び出しと呼びます。現在のコマンド・プロシージャ・レベルで定義されたラベルとローカル・シンボルは,GOSUB コマンドで呼び出されたサブルーチンで使用できます。GOSUB コマンドは,プロシージャ・レベル当り,最高 16 レベルまでネストできます。
コマンド・インタプリタは,ラベルを検出すると,ラベル・テーブルにラベルを入れます。このテーブルは,ローカル・シンボル・テーブルで使用できる領域から割り当てられます。コマンド・インタプリタがすでにテーブルに存在しているラベルを検出すると,既存の定義が新しい定義で置き換えられます。したがって,重複ラベルを使用すると,制御は常に DCL が最後に読み取ったラベルに移ります。次の規則が適用されます。
- GOSUB コマンドの前と後に重複ラベルがある場合,制御はコマンドの前にあるラベルに移ります。
- すべての重複ラベルが GOSUB コマンドより前にある場合,制御は,最新のラベル,つまり GOSUB コマンドに最も近いラベルに移ります。
- すべての重複ラベルが GOSUB コマンドより後にある場合,制御は, GOSUB コマンドに最も近いラベルに移ります。
現在のコマンド・プロシージャにラベルが存在しない場合,プロシージャは続行できないため,強制終了します。
ラベルに使用できる領域のサイズには,制限があることに注意してください。コマンド・プロシージャが多くのシンボルを使用し,多くのラベルがある場合,コマンド・インタプリタのテーブル領域が不足し,エラー・メッセージが出ることがあります。
#1 |
---|
$! $! GOSUB.COM $! $ SHOW TIME $ GOSUB TEST1 $ WRITE SYS$OUTPUT "success completion" $ EXIT $! $! TEST1 GOSUB definition $! $ TEST1: $ WRITE SYS$OUTPUT "This is GOSUB level 1." $ GOSUB TEST2 $ RETURN %X1 $! $! TEST2 GOSUB definition $! $ TEST2: $ WRITE SYS$OUTPUT "This is GOSUB level 2." $ GOSUB TEST3 $ RETURN $! $! TEST3 GOSUB definition $! $ TEST3: $ WRITE SYS$OUTPUT "This is GOSUB level 3." $ RETURN |
このコマンド・プロシージャは,ラベルを付けられたサブルーチンへ制御を移すための GOSUB コマンドの使い方を示します。 GOSUB コマンドは TEST1にラベルを付けたサブルーチンに制御を移動します。プロシージャは,サブルーチン TEST1 でコマンドを実行し,サブルーチン TEST2 へ分岐します。その後,プロシージャは,サブルーチン TEST2 でコマンドを実行し,サブルーチン TEST3 へ分岐します。それぞれのサブルーチンは RETURN コマンドによって終了します。 TEST3 が実行された後, RETURN コマンドはそれぞれの呼出し GOSUB ステートメントに後続するコマンドラインへ制御を返します。この時点で,プロシージャはうまく実行されています。
目次 | 索引 |
|