マニュアルページ 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