[ 前のページ ] [ 次のページ ] [ 目次 ] [ 索引 ] [ DOC Home ]

8 DCLディクショナリ - G -


GOSUB

コマンド・プロシージャ・レベルを変更せずに, 制御をコマンド・プロシージャ内のラベルが付けられたサブルーチンに渡します。

フォーマット

     GOSUB  ラベル 

パラメータ

ラベル

コマンド行の最初の項目として,1文字から255文字までの英数字のラベルを指定します。 ラベルの中にブランクを含むことはできません。 GOSUBコマンドの実行後,制御は指定されたラベルのあとのコマンドに渡されます。

ラベルは,現在のコマンド・プロシージャの中で, GOSUBステートメントの前でもあとでもかまいません。 コマンド・プロシージャ内でラベルを使用する場合には, 最後にコロンを指定しなければなりません。 ラベルが重複している場合,最も最近読まれたラベルへ飛びます。

説明

ラベルで指定されたサブルーチンへ制御を移すには, コマンド・プロシージャでGOSUBコマンドを使用します。 コマンド・ストリームをランダム・アクセス装置(つまりディスク装置) から読み取っていないと,GOSUBコマンドは動作しません。

RETURNコマンドは,GOSUBサブルーチン・プロシージャを終了させ, GOSUB文の呼び出しの次のコマンドへ制御を移します。 RETURNコマンドは,省略可能な状態値を受け付けます。

GOSUBコマンドでは,新しいプロシージャ・レベルは生成されません。 したがって,これを "ローカルの" サブルーチン呼び出しと呼びます。 現在のコマンド・プロシージャ・レベルで定義されたラベルとローカル・シンボルは, GOSUBコマンドで呼び出されたサブルーチンで使用できます。 GOSUBコマンドは,プロシージャ・レベル当り,最高16レベルまでネストできます。

コマンド・インタプリタは,ラベルを検出すると, ラベル・テーブルにラベルを入れます。このテーブルは, ローカル・シンボル・テーブルで使用できる領域から割り当てられます。 コマンド・インタプリタがすでにテーブルに存在しているラベルを検出すると, 既存の定義が新しい定義で置き換えられます。したがって,重複ラベルを使用すると, 制御は常にDCLが最後に読み取ったラベルに移ります。次の規則が適用されます。

現在のコマンド・プロシージャにラベルが存在しない場合, プロシージャは続行できないため,強制終了します。

ラベルに使用できる領域のサイズには,制限があることに注意してください。 コマンド・プロシージャが多くのシンボルを使用し,多くのラベルがある場合, コマンド・インタプリタのテーブル領域が不足し, エラー・メッセージが出ることがあります。

  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ステートメントに後続するコマンドラインへ制御を返します。 この時点で,プロシージャはうまく実行されています。


GOTO

制御をコマンド・プロシージャ内のラベルが付けられたステートメントに渡します。

フォーマット

     GOTO  ラベル 

パラメータ

ラベル

コマンド行の最初の項目として,1文字から255文字までの英数字のラベルを指定します。 ラベルの中にブランクを含むことはできません。 GOTOコマンドの実行後,制御は指定されたラベルのあとのコマンドに渡されます。

ラベルは,現在のコマンド・プロシージャの中で, GOTOステートメントの前でもあとでもかまいません。 コマンド・プロシージャ内でラベルを使用する場合には, 最後にコロンを指定しなければなりません。 ラベルが重複している場合,最も最近読まれたラベルへ飛びます。

説明

プロシージャ内の次の行ではない行に制御を移すには, コマンド・プロシージャでGOTOコマンドを使用します。 ラベルは,現在のコマンド・プロシージャのGOTO文の前でも後でも使用できます。 コマンド・ストリームがランダム・アクセス装置(つまりディスク装置) から読み取られていない場合,GOTOコマンドは動作しません。

GOTOコマンドのターゲット・ラベルが別のIF-THEN-ELSE構造内にある場合は, エラー・メッセージ(DCL-W-USGOTO)が返されます。

コマンド・インタプリタは,ラベルを検出すると, ラベル・テーブルにラベルを入れます。このテーブルは, ローカル・シンボル・テーブルで使用できる領域から割り当てられます。 コマンド・インタプリタがすでにテーブルに存在しているラベルを検出すると, 既存の定義が新しい定義で置き換えられます。したがって, 重複ラベルを使用すると,制御は常にDCLが最後に読み取ったラベルに移ります。 次の規則が適用されます。

現在のコマンド・プロシージャにラベルが存在しない場合, プロシージャは続行できないので,強制終了します。

ラベルに使用できる領域のサイズには,制限があることに注意してください。 コマンド・プロシージャが多くのシンボルを使用し,多くのラベルがある場合, コマンド・インタプリタのテーブル領域が不足し, エラー・メッセージが出ることがあります。

  1. $ IF P1 .EQS. "HELP" THEN GOTO TELL
    $ IF P1 .EQS. "" THEN GOTO TELL
       .
       .
       .
    $ EXIT
    $ TELL:
    $ TYPE SYS$INPUT
    To use this procedure, you must enter a value for P1.
       .
       .
       .
    $ EXIT
    
    この例では,IFコマンドはプロシージャに渡された最初のパラメータを調べます。 このパラメータがHELPという文字列の場合, あるいはパラメータが指定されていない場合には,GOTOコマンドが実行され, 制御はTELLというラベルの行に移ります。 それ以外の場合には,プロシージャはEXITコマンドが検出されるまで実行を継続します。 TELLというラベルでは, TYPEコマンドがプロシージャの使用方法を示す入力ストリームのデータを表示します。

  2. $ ON ERROR THEN GOTO CHECK
       .
       .
       .
    $ EXIT
    $ CHECK:  ! Error handling routine
       .
       .
       .
    $ END:
    $ EXIT
    
    ONコマンドは,エラー処理ルーチンを設定します。 そのあと,コマンド・プロシージャ内で実行されるコマンドあるいはプロシージャが, エラーまたは重大なエラーを報告した場合には,GOTOコマンドは, 制御をCHECKというラベルに移します。


[ 前のページ ] [ 次のページ ] [ 目次 ] [ 索引 ] [ DOC Home ]