gtool4/Fortran 90 library document
2000-08-28 豊田英司
プログラムの部品は必ずエラーの取り扱いを明確に規定すべきものである。エラーとは当該部品への入力が不適切であるとか、期待される動作をすることができないといった事態である。
gtool4/Fortran 90 ライブラリがユーザに提供する手続 (手続とはサブルーチンまたは関数の総称) はほとんどの場合、以下の2つの方式のいずれかで呼び出し元にエラーを報告する。
エラーが発生すると適切なメッセージを表示してプログラム終了
論理型の省略できる引数 err が与えられた場合は、エラー時にはそれを真にする。err が省略された場合は上に同じ
これらの処理はすべて dc_error モジュールの StoreError サブルーチンで行っている。StoreError は以下のような引用仕様を持つ。
subroutine StoreError(number, where, err, cause_s, cause_i) use DC_STRING integer, intent(in):: number character(len = *), intent(in):: where logical, intent(out), optional:: err type(VSTRING), intent(in), optional:: cause_s integer, intent(in), optional:: cause_i end subroutine |
必要な引数は2つであり、第1引数は整数型のエラーコード、第2引数は文字型でエラーの発生した手続名を与える。デフォルトでは
where: error_message または where(cause_s): error_message |
の形式の文字列が端末に表示されてプログラムは終了する。
gtool4 ライブラリにコードを追加するプログラマは適切なエラーコードで StoreError を呼び出すようにしなければならない。そこで、新しいエラーコードを定義する必要があるかどうか hygggを判定するために、エラーコードの値と対応するメッセージを一覧する。エラーコードニーモニックを使用するためには、NF_E で始まる名前については netcdf_f77 モジュールを引用するか include 'netcdf.inc' を行い(後者は推奨されない)、GT_E で始まる名前については dc_error モジュールを引用する。
エラーコードの数値の欄を設けたのは新たなエラーコードを割り当てる際の指針を示すためである。コードではエラーコードをニーモニックで与えるべきであり、数値をハードコードすることは厳に慎まれたい。
数値 | ニーモニック | エラーメッセージ |
(正の値) | なし | (NetCDF ライブラリは libc のエラーコード errno を返す可能性がある。errno の数値には移植性がないため、すべての正の整数値は errno の仕様のために予約されている) |
0 | NF_NOERR | No Error |
-33 | NF_EBADID | Not a netCDF id: |
-34 | NF_ENFILE | Too many netCDF files open: |
-35 | NF_EEXIST | netCDF file exists && NC_NOCLOBBER: |
-36 | NF_EINVAL | Invalid argument: |
-37 | NF_EPERM | Write to read only: |
-38 | NF_ENOTINDEFINE | Operation not allowed in data mode |
-39 | NF_EINDEFINE | Operation not allowed in define mode |
-40 | NF_EINVALCOORDS | Index exceeds dimension bound |
-41 | NF_EMAXDIMS | NC_MAX_DIMS exceeded |
-42 | NF_ENAMEINUSE | String match to name in use |
-43 | NF_ENOTATT | Attribute not found |
-44 | NF_EMAXATTS | NC_MAX_ATTRS exceeded |
-45 | NF_EBADTYPE | Not a netCDF data type or _FillValue type mismatch |
-46 | NF_EBADDIM | Invalid dimension id or name |
-47 | NF_EUNLIMPOS | NC_UNLIMITED in the wrong index |
-48 | NF_EMAXVARS | NC_MAX_VARS exceeded |
-49 | NF_ENOTVAR | Variable not found |
-50 | NF_EGLOBAL | Action prohibited on NC_GLOBAL varid |
-51 | NF_ENOTNC | Not a netCDF file |
-52 | NF_ESTS | In Fortran, string too short |
-53 | NF_EMAXNAME | NC_MAX_NAME exceeded |
-54 | NF_EUNLIMIT | NC_UNLIMITED size already in use |
-55 | NF_ENORECVARS | NC_rec op when there are no record vars |
-56 | NF_ECHAR | Attempt to convert between text & numbers |
-57 | NF_EEDGE | Edge+start exceeds dimension bound |
-58 | NF_ESTRIDE | Illegal stride |
-59 | NF_EBADNAME | Attribute or variable name contains illegal characters |
-60 | NF_ERANGE | Numeric conversion not representable |
-61 | NF_ENOMEM | Memory allocation (malloc) failure |
-62〜-99 | (将来の netCDF の拡張に備えた gtool4 の予約領域) | |
-100 | GT_EFAKE | function not implemented |
-101 | GT_ENOMOREDIMS | dimension number %d is out of range |
-102 | GT_EDIMNODIM | dimension variable has no dimension |
-103 | GT_EDIMMULTIDIM | dimension variable has many dimensions |
-104 | GT_EDIMOTHERDIM | dimension variable has another dimension |
-105〜-199 | 将来の gtdata 層のエラーメッセージのため予約 | |
-200 | GT_EFIGNOHAXIS | horizontal axis is missing |
-201 | GT_EFIGNOVAXIS | vertical axis is missing |
-202以下の数値 | 将来の gtgraph 層のエラーメッセージのため予約 |