Oracle Solaris Studio 12.4 Man Pages

印刷ビューの終了

更新: January 2015
 
 

set_io_err_handler(3F)

名前

set_io_err_handler , get_io_err_handler - 入出力エラーハンドラを設定および取得する

形式

USE SUN_IO_HANDLERS
SUBROUTINE SET_IO_ERR_HANDLER(IU, SUB_NAME, ISTAT)
    INTEGER(8) IU
    EXTERNAL SUB_NAME
    INTEGER(4) ISTAT
SUBROUTINE GET_IO_ERR_HANDLER(IU, SUB_PTR, ISTAT)
    INTEGER(8) IU
    EXTERNAL SUB_NAME
    POINTER (SUB_PTR, SUB_NAME)
    INTEGER(4) ISTAT

説明

SET_IO_ERR_HANDLER は、入力エラーが発生したときに、ユーザーが指定したサブルーチン SUB_NAME が論理ユニット IU 用の入出力エラーハンドラとして使用されるように設定します。IU は、書式付きファイル用に接続された Fortran 論理ユニットである必要があります。ISTAT は、エラーが発生した場合にはゼロ以外の値、それ以外の場合にはゼロに設定されます。たとえば、SET_IO_ERR_HANDLER が論理ユニット IU が開かれる前に呼び出された場合、ISTAT は 1001 (「不正なユニット」) に設定されます。SUB_NAMENULL の場合は、ユーザーのエラー処理がオフになり、プログラムはデフォルトの Fortran エラー処理に戻ります。

この論理ユニット用のエラーハンドラとして現在使用されている関数のアドレスを取得するには、GET_IO_ERR_HANDLER を使用します。たとえば、GET_IO_ERR_HANDLER を呼び出すと、別のハンドラルーチンに切り替わる前に、現在の入出力が保存されます。エラーハンドラは、あとで保存した値で復元できます。

SET_IO_ERR_HANDLERGET_IO_ERR_HANDLER はモジュールサブルーチンであり、USE SUN_IO_HANDLERS が呼び出し側ルーチンで発生した場合にのみアクセスできます。

SUB_NAME は、論理ユニット IU で入出力エラーを処理するためのユーザー指定ルーチンの名前です。実行時入出力ライブラリは、すべての関連情報を SUB_NAME に渡します。これにより、このルーチンが問題を診断し、エラーを修正してから続行できるようになります。

入出力ハンドラへのインタフェースは次のとおりです。

    SUBROUTINE SUB_NAME(UNIT, SRC_FILE, SRC_LINE,
X       DATA_FILE, FILE_POS, CURR_BUFF,
X       CURR_ITEM, CORRECT,CHAR, CORR_ACTION )
INTENT (IN) UNIT, SRC_FILE, SRC_LINE, DATA_FILE
INTENT (IN) FILE_POS, CURR_BUFF, CURR_ITEM
INTENT (OUT) CORRECT_CHAR, CORR_ACTION
INTEGER(8) UNIT

エラーが発生した入力ファイルの論理ユニット。

CHARACTER*(*) SRC_FILE

入力操作が発生した Fortran ソースファイルの名前。

INTEGER(8) SRC_LINE

入力操作の SRC_FILE の行番号。

CHARACTER*(*) DATA_FILE

読み込まれるデータファイルの名前。これは、ファイルが開かれた外部ファイルである場合にのみ使用可能です。ファイル名が使用できない場合 (論理ユニット 5 など)、DATA_FILE は長さがゼロの文字データ項目に設定されます。

INTEGER(8) FILEPOS

入力ファイルの現在の位置 (バイト単位)。これは、入力ファイル DATA_FILE の名前が既知の場合にのみ定義されます。

CHARACTER*(*) CURR_BUFF

文字列の最初の文字として不正な入力文字が存在する入力レコードの残りのデータを含む文字列。

INTEGER(8) CURR_ITEM

エラーが発生したときに読み込まれたレコード内の入力項目の数 (現在の項目も含む)。例: READ(12,10)L,(ARR(I),I=1,L) この場合、CURR_ITEM の値が 15 の場合、L が 1 番目の項目、ARR(1) が 2 番目の項目のようになっている状態では、ARR の 14 番目の要素を読み取るときにエラーが発生します。

CHARACTER CORRECT_CHAR

ハンドラから返されるユーザー指定の修正済み文字。このパラメータは、CORR_ACTION パラメータがゼロ以外の値に設定されている場合にのみ使用されます。

CORRECT_CHAR が無効な文字に設定されている場合、有効な値が返されるまでハンドラルーチンが繰り返し呼び出されます。ハンドラが有効な文字を返さない場合は、無限ループが発生する可能性があります。ユーザーは、この発生を検出し、保護する必要があります。

INTEGER CORR_ACTION

入出力実行時ライブラリで取られる修正アクションを指定するために、次の 2 つの値を指定できます。0 何もしません。デフォルトのエラー処理を使用します。1 ユーザーのエラーハンドラルーチンから返された CORRECT_CHAR の使用を続行します。

制限事項

制限事項

入出力ハンドラは、1 文字を別の 1 文字に置換できるだけです。1 文字を 2 文字以上で置換することはできません。

エラー回復アルゴリズムは、現在読み込まれている不正な文字を修正できるだけで、別のコンテキストで有効な文字として解釈された不正な文字を修正することはできません。たとえば、リスト指示の読み込みで、正しい入力が "1.2345 9.8765" であるときに入力が "1.234509.8765" であれば、有効な数値ではないため、入出力ライブラリでは第 2 期間にエラーが発生します。ただし、その期間までに、戻って' 0' を <空白> に変更することはできません。

現在、このエラー処理機能は名前リスト指示の入力では動作しません。名前リスト指示の入力を行うと、エラー発生時に、指定された入出力エラーハンドラが起動されません。

内部ファイルに関連付けられた論理ユニットは存在しないため、入出力エラーハンドラは外部ファイル用にしか設定できません。

入出力エラーハンドラは、構文エラー時にのみ呼び出され、システムエラーやセマンティックエラー (入力値のオーバーフローなど) 時には呼び出されません。

ユーザー指定の入出力エラーハンドラが、不正な文字を入出力ライブラリに返し続けると、無限ループが発生することによって、ユーザー指定の入出力エラーハンドラが繰り返し呼び出される可能性があります。エラーが同じファイル位置で発生し続けると、エラーハンドラ自体が終了します。このように行うには、CORR_ACTION を 0 に設定して、デフォルトのエラーパスを取得します。これにより、入出力ライブラリで通常のエラー処理が続行されます。

ファイル

libfui.so sun_io_handlers.mod