SET_IO_ERR_HANDLER(3F)

名前
set_io_err_handler, get_io_err_handler - set/get I/O Error 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_NAME が NULL の場合、ユーザーのエラー処理がオフに設定され、プログラムはデフォルトの Fortran エラー処理に戻ります。

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

SET_IO_ERR_HANDLER および GET_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 は長さが 0 の文字データ項目に設定されます。

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 を最初の項目として、 ARR(1) を 2 番目の項目として指定して ARR の 14 番目の要素を読み込む間に エラーが発生することを意味します。

CHARACTER CORRECT_CHAR
    ハンドラにより戻されるユーザーが供給した修正済みの文字です。 このパラメータは CORR_ACTION パラメータがゼロ以外の値に設定される場合のみ使用できます。

    CORRECT_CHAR が無効な文字に設定された場合、 有効な値が戻されるまでハンドラルーチンが再度呼び出されます。 ハンドラにより有効な文字が与えられない場合は、無限ループが発生する 可能性があります。ユーザーはこの事態を検出し、防ぐ必要があります。

INTEGER CORR_ACTION
    入出力ライブラリが行う正しい動作を指定し、以下の 2 つが 選択可能です。
    0 何もしません。デフォルトのエラー処理を使用します。
    1 ユーザーエラーハンドラルーチンにより戻された CORRECT_CHAR の使用を継続します。

制限事項
入出力エラーは 1 文字を 1 文字でのみ置き換えられます。 1 文字を 1 文字以上で置き換えることはできません。

エラー回復アルゴリズムは現在読み込んでいる不正な文字のみを修正できます。 別の文脈で有効な文字として解釈された文字は、不正なものでも修正できません。 例えば、並びによる読み込みで、正しい入力が "1.2345 9.8765" である必要が ある場合に入力が "1.234509.8765" であると、入出力ライブラリは、次回 エラーとして実行されます。これは、有効な数値ではないのですが、 元に戻って '0' を <空白> に変更することができないためです。

現在、このエラー処理機能は変数群による入力用に使用できません。 変数群による入力を行うと、エラー発生時に 指定した入出力エラーハンドラは起動されません。

入出力エラーハンドラは内部ファイルではなく、外部ファイルに対して のみ設定できます。内部ファイルに関連付けされる論理ユニットが 存在しないからです。

入出力エラーハンドラは構文エラーに対してのみ呼び出されます。 システムエラーや意味上の誤り (オーバーフローした入力値など) に対しては呼び出されません。

ユーザー供給入出力エラーハンドラが、不正な文字を入出力ライブラリに 対して供給し続ける場合に、無限ループとなる可能があります。 結果として、ユーザー供給入出力エラーハンドラが繰り返し何度も呼び出されます。 エラーが同じファイル位置で発生し続ける場合、エラーハンドラは 自身で終了する必要があります。この方法として、 CORR_ACTION を 0 に設定して、デフォルトのエラーパスを取得します。 これにより、入出力ライブラリは通常のエラー処理を継続します。

ファイル
libfui.so
sun_io_handlers.mod