日本-日本語 |
|
|
|
OpenVMS マニュアル |
|
OpenVMS
|
目次 | 索引 |
プログラム・スタブ とは,設計をテストするときに,プロシージャで使用する一時的なコード・セクションです。通常,プログラム・スタブは,そのスタブのかわりに実際に使用される機能を示すメッセージを出力します。全体の設計が正しく動作することを確認した後は,各スタブを正しいコーディングに置き換えます。
次の例では,変数の割り当てと条件のテスト方法を示しています。
$ INQUIRE COMMAND- "Enter command (DELETE, DIRECTORY, EXIT, PRINT, PURGE, TYPE)" $ IF COMMAND .EQS. "EXIT" THEN EXIT $! $! Execute if user entered DELETE $ DELETE: $ IF COMMAND .NES "DELETE" THEN GOTO DIRECTORY (1) (2) $ WRITE SYS$OUTPUT "This is the DELETE section." (3) $! Execute if user entered DIRECTORY $ DIRECTORY: (4) $ IF COMMAND .NES "DIRECTORY" THEN GOTO PRINT $ WRITE SYS$OUTPUT "This is the DIRECTORY section." . . . $! Execute if user entered TYPE $ TYPE: $ IF COMMAND .NES "TYPE" THEN GOTO ERROR (5) $ WRITE SYS$OUTPUT "This is the TYPE section." $! $ ERROR: $ WRITE SYS$OUTPUT "You have entered an invalid command." (6) $! $ EXIT |
例を確認するときは,次のことに注意してください。
ループとは,条件が満足されるまで繰り返し実行される文の集まりです。ループは次のように機能します。
ループを作成するには,次の手順を実行します。
手順 | 操作 |
---|---|
1 | ループの先頭にラベルを付ける。 |
2 | 変数を調べて,ループの中のコマンドを実行する必要があるかどうかを判別する。 |
3 | ループを実行する必要がない場合には,ループの終わりに進む。 |
4 | ループを実行する必要がある場合には,ループ本体の中のコマンドを実行してから,ループの始めに戻る。 |
5 | ループを終了する。 |
次の例では, CLEANUP.COM コマンド・プロシージャでのループの使い方を示しています。
$ GET_COM_LOOP: $ INQUIRE COMMAND- $ "Enter command (DELETE, DIRECTORY. EXIT, PRINT, PURGE, TYPE)" $ IF COMMAND .EQS. "EXIT" THEN GOTO END_LOOP $! $! Execute if user entered DELETE $ DELETE: $ IF COMMAND .NES. "DELETE" THEN GOTO DIRECTORY $ WRITE SYS$OUTPUT "This is the DELETE section." $ GOTO GET_COM_LOOP . . . $ END_LOOP: $ WRITE SYS$OUTPUT "Directory ''F$DIRECTORY()' has been cleaned" $ EXIT |
コマンドを実行した後,ユーザが EXIT コマンドを入力するまで,制御は GET_COM_LOOP ラベルに戻されます。 EXIT コマンドが入力されると,プロシージャはディレクトリが整理されたことを示すメッセージを出力します。
13.5.4 手順 4: コマンド・プロシージャを終了する
コマンド・プロシージャを終了するには,次の手順を実行します。
手順 | 操作 |
---|---|
1 | どこでコマンド・プロシージャを終了するかを判断する。 |
2 | 必要に応じて EXIT または STOP コマンドを指定する。 |
コマンド・プロシージャで EXIT コマンドを使用すると,次のことが可能になります。
次の例は,プロシージャの最後に指定されているエラー処理ルーチンを実行しないようにするために,EXIT コマンドを使用する方法を示しています。
. . . $ EXIT ! End of normal execution path $ ERROR_ROUTINE . . . |
次の例は,複数の実行パスを持つプロシージャを終了するために, EXIT コマンドを使用する方法を示しています。
$ START: $ IF P1 .EQS. "TAPE" .OR. P1 .EQS. "DISK" THEN GOTO 'P1' $ INQUIRE P1 "Enter device (TAPE or DISK)" $ GOTO START $ TAPE: !Process tape files . . . $ EXIT $ DISK: ! Process disk files . . . $ EXIT |
各ラベル (TAPE と DISK) の後のコマンドは,プロシージャで異なるパスを与えます。 DISK ラベルの前の EXIT コマンドは,プロシージャがそのラベルに明示的に分岐した場合を除き,DISK ラベルの後のコマンドが実行されないようにします。
プロシージャの最後に EXIT コマンドを指定する必要はありません。これは,プロシージャのエンド・オブ・ファイルにより,暗黙に EXIT コマンドが実行されるからです。しかし,なるべく EXIT コマンドを指定するようにしてください。
13.5.4.2 STOP コマンドの使用
コマンド・プロシージャで STOP コマンドを使用すると,重大なエラーが発生したときに,プロシージャを終了することができます。会話形式で実行されているコマンド・プロシージャで STOP コマンドを使用した場合には,制御は DCL レベルに戻されます。バッチ・モードで実行されているコマンド・プロシージャの場合には,バッチ・ジョブが終了します。
このコマンド行は,重大なエラーが発生したときに,プロシージャを停止するように要求します。
$ ON SEVERE_ERROR THEN STOP |
13.5.5 手順 5: プログラム・ロジックをテストおよびデバッグする
プログラム・スタブを使用してコードを作成した場合には,コマンド・プロシージャの全体的なロジックをテストしなければなりません。可能性のあるすべての実行パスをテストしなければなりません。
コマンド・プロシージャをテストおよびデバッグするには,次の手順を実行します。
手順 | 操作 |
---|---|
1 | コマンド・プロシージャに正しい各コマンドを入力して,プログラム・ロジックをテストする。 |
2 | 誤ったコマンドを入力して,プログラム・ロジックのテストを継続する。 |
3 | EXIT コマンドを使用して,コマンド・プロシージャを終了することにより,プログラム・ロジックのテストを終了する。 |
4 | 必要な場合には,SET VERIFY,SET PREFIX, SHOW SYMBOL コマンドを使用して,プログラムをデバッグする。 |
次の例では,可能な各コマンドと無効なコマンドを入力および実行して,コマンド・プロシージャをテストし,最後にプロシージャを終了する方法を示しています。
$ @CLEANUP Enter command (DELETE, DIRECTORY, EXIT, PRINT, PURGE, TYPE): DELETE This is the DELETE section. Enter command (DELETE, DIRECTORY, EXIT, PRINT, PURGE, TYPE): DIRECTORY This is the DIRECTORY section. . . . Enter command (DELETE, DIRECTORY, EXIT, PRINT, PURGE, TYPE): PRINF You have entered an invalid command. Enter command (DELETE, DIRECTORY, EXIT, PRINT, PURGE, TYPE): EXIT $ |
次のコマンドは,コマンド・プロシージャをデバッグするのに役立ちます。
次の例では,END_LOP というラベルの綴りが誤っています。チェック機能が有効に設定されているため,エラーがどこで発生したのかを正確に判断できます。
13.5.5.1 コマンド・プロシージャのデバッグ
実行する前に各行を表示する。チェック設定でエラーが発生した場合には,そのエラーと,エラーを生成した行が表示される。 SET VERIFY コマンドでは,コマンド行だけをチェックするのか,データ行もチェックするのかを指定するために,キーワードを使用できる。
SET VERIFY コマンドは,ログアウトするまで,SET NOVERIFY コマンドを入力するまで,または F$VERIFY レキシカル関数を使用してチェック設定を変更するまで有効である ( チェック設定の変更についての詳しい説明は,
第 15 章 を参照 )。
チェック機能が有効な場合には,DCL コマンド SET PREFIX を使用し,各コマンド行の前に,そのコマンドが実行された時刻を挿入することにより,プロシージャ・ログ・ファイルにタイム・スタンプを出力できる。
SHOW SYMBOL コマンドを使用すれば,プロシージャ内のシンボルがどのように定義されているかを判断できる。
$ SET VERIFY $ @CLEAN $ GET_COM_LOOP: $ INQUIRE COMMAND - "Enter command (DELETE, DIRECTORY, EXIT, PRINT, PURGE, TYPE)" Enter command (DELETE, DIRECTORY, EXIT, PRINT, PURGE, TYPE): EXIT $ IF COMMAND .EQS. "EXIT" THEN GOTO END_LOP %DCL-W-USGOTO, target of GOTO not found - check spelling and presence of label |
エラーを修正するには,ラベルを END_LOOP に変更します。
次の例ではタイム・スタンプの使い方を示しています。
$ SET VERIFY $ @TEST $ SET DEFAULT SYS$LOGIN $ SHOW DEFAULT USER$:[SMYTHE] $ SET PREFIX "(!5%T) " $ @TEST (17:52) $ SET DEFAULT SYS$LOGIN (17:52) $ SHOW DEFAULT USER$:[SMYTHE] |
次の例では,SHOW SYMBOL コマンドを使用して,シンボル COMMAND がどのように定義されているか判断する方法を示しています。
$ SET VERIFY $ @CLEAN $ GET_COM_LOOP: $ INQUIRE COMMAND - "ENTER COMMAND (DELETE, DIRECTORY, EXIT, PRINT, PURGE, TYPE)" ENTER COMMAND (DELETE, DIRECTORY, EXIT, PRINT, PURGE, TYPE): EXIT $ SHOW SYMBOL COMMAND COMMAND = "EXIT" $ IF COMMAND .EQS. "exit" THEN GOTO END_LOOP . . . |
SHOW SYMBOL コマンドを実行すると,シンボル COMMAND の値が "EXIT" であることがわかります。INQUIRE コマンドは入力を大文字に自動的に変換しますが,コマンドをテストする IF 文では,文字列 "exit" で小文字を使用しているため, DCL は文字列が等しくないと判断します。このエラーを修正するには, IF 文に指定した,引用符で囲んだ文字列を大文字にします。文字列の残りの部分は,大文字でも小文字でもかまいません。
13.5.5.2 実行中にチェック機能をオンにする
コマンド・プロシージャの実行中に割り込みをかけて,チェック機能を有効にすることもできます。コマンド・プロシージャに SET VERIFY コマンドや Ctrl/Y キー・シーケンスが含まれていない限り,次の操作を実行して,チェック機能を有効に設定できます。
手順 | 操作 |
---|---|
1 | Ctrl/Y を押して実行に割り込みをかける。 |
2 | SET VERIFY コマンドを入力する。 |
3 | CONTINUE コマンドを入力して,コマンド・プロシージャの実行を続行する ( チェック機能を有効にした状態で )。 |
一般に,コマンド・プロシージャを実行した結果,ユーザのプロセス状態が変化しないようにしなければなりません。したがって,コマンド・プロシージャには,プロセスをもとの状態に戻す一連のコマンドを指定しなければなりません。このコマンドは通常,"CLEAN_UP" というラベルの付いたサブルーチンの一部です。一般的なクリーンアップ操作としては,ファイルを閉じる操作と,省略時のデバイスおよびディレクトリをリセットする操作があります。
コマンド・プロシージャにクリーンアップ・タスクを追加するには,次の操作を実行します。
手順 | 操作 |
---|---|
1 | CLEAN_UP などのラベルを使用して,クリーンアップ・サブルーチンを開始する。 |
2 | F$GETJPI レキシカル関数を使用して,開かれているファイルがあるかどうかテストする。 |
3 | DELETE コマンドまたは PURGE コマンドを使用して,一時ファイルまたは余分なファイルを削除する。 |
4 | (デバイスやディレクトリなど) 省略時の設定を変更した場合には,SET DEFAULT コマンドを使用して,元の状態に復元する。 |
5 | クリーンアップ操作が確実に実行されるように, ON CONTROL_Y 文を指定する。 |
ファイルが開かれている場合には,プロシージャを終了する前に確実にファイルを閉じてください。レキシカル関数 F$GETJPI を使用すれば,プロセスに対して残されているオープン・ファイル・クォータ (FILCNT) を調べることができます。 FILCNT が,コマンド・プロシージャの開始時と終了時に同じである場合には,開かれたままになっているファイルはありません。
この例では,ファイルが開かれたままになっていることをユーザに警告するために使用するコマンドを示しています。
$ FIL_COUNT = F$GETJPI ("","FILCNT") . . . $ IF FILCNT .NE. F$GETJPI ("", "FILCNT") THEN- WRITE SYS$OUTPUT "WARNING -- file left open) |
一時ファイルを作成した場合には,それを削除します。一般に,ファイルを更新した場合には,ファイルをパージして以前のコピーを削除しなければなりません。自分で作成していないファイルを削除する場合には,そのファイルを削除してもかまわないかどうか確認してください。たとえば,重要なデータが格納されているファイルを更新した場合には,バージ操作は必要に応じて省略できます。
省略時のデバイスとディレクトリのどちらか一方または両方を変更した場合には,コマンド・プロシージャを終了する前に,元の省略時の設定に戻さなければなりません。元の省略時のディレクトリの名前をセーブするには, F$ENVIRONMENT レキシカル関数の DEFAULT キーワードを使用します。コマンド・プロシージャの最後に,保存したデバイスとディレクトリを復元する SET DEFAULT コマンドを指定します。
この例に示したコマンド行は,デバイスとディレクトリの省略時の設定を保存し,復元します。
$ SAV_DEFAULT = F$ENVIRONMENT ("DEFAULT") . . . $ SET DEFAULT 'SAV_DEFAULT' |
次の表は,一般に変更されるその他のプロセス属性,これらの属性をセーブするために使用されるレキシカル関数,復元するために使用されるレキシカル関数またはコマンドを示しています。
属性 | セーブのための レキシカル関数 |
復元のための レキシカル関数 |
---|---|---|
DCLプロンプト | F$ENVIRONMENT | SET PROMPT |
省略時の保護 | F$ENVIRONMENT | SET PROTECTION/DEFAULT |
特権 | F$SETPRV | F$SETPRV または
SET PROCESS/PRIVILEGES |
制御文字 | F$ENVIRONMENT | SET CONTROL |
検査 | F$VERIFY | F$VERIFY |
メッセージ・フォーマット | F$ENVIRONMENT | SET MESSAGE |
キーの状態 | F$ENVIRONMENT | SET KEY |
これらのレキシカル関数についての詳細は,『OpenVMS DCL ディクショナリ』を参照してください。
目次 | 索引 |
|