インテル® Fortran コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス
Fortran DLL アプリケーションのカスタムハンドラーの作成には 2 つの方法があります。
エラーと例外を含める方法
浮動小数点トラップを有効にする方法
Fortran DLL をビルドして、他の言語で記述されたメインプログラムからその呼び出しを行う場合、DLL のエラーと例外がメイン・アプリケーションをクラッシュさせないように注意してください。
Fortran DLL をビルドする際に注意しなければならないいくつかの基本原則を次に示します。
呼び出し元にステータスを返し、呼び出し元で何をするかを決定できるようにライブラリー・ルーチンを作成します。
想定されるステータスを呼び出し元に返すには、ライブラリー・コードで細心の注意を払う必要があります。そのため、次の原則を考慮してください。
ライブラリー・コードの適切な場所で、呼び出し元から渡される入力引数を検証し、ライブラリー・ルーチンで使用可能な値かどうかを確認します。例えば、有効な範囲の入力を処理し、定義されている動作を行う数値アルゴリズムを実装するルーチンがあるとします。アルゴリズムを実行する前に入力引数を検証することで、(予期しない浮動小数点例外のような) 想定外の動作を避けることができます。ISNAN や FP_CLASS のような Fortran 組込みプロシージャーを使用して、例外 IEEE 数を検知することができます。DLL コードは、問題を示すステータスを呼び出し元に返し、呼び出し元が適切な動作 (アプリケーションをシャットダウンする、別の入力を試みる、など) を行えるようにする必要があります。
ライブラリー・コードで、I/O ルーチンの呼び出しおよび動的メモリーの割り当て/割り当て解除の成功または失敗を、常に検証するようにします。Fortran では、I/O 文の ERR、END、EOR、および IOSTAT 引数 (オプション) を使用して、要求した I/O が成功したかどうかを判断できます。また、動的メモリーの ALLOCATE 文と DEALLOCATE 文には、動的メモリーの割り当て/割り当て解除のステータスを取得して、プログラムの終了を回避することができる STAT 指定子 (オプション) があります。
エラーが発生したときの動作を指定しない場合、Fortran ランタイムシステムは処理できない致命的なエラーとしてエラーを処理し、プログラムを終了させます。OPEN 文でファイルが見つからないというエラーを表示するための IOSTAT と ERR の使用例については、「IOSTAT 指定子と Fortran 終了コードの使用」を参照してください。同様の処理をコードで記述することもできますが、Visual Basic* やほかの Fortran 以外のメインプログラムにステータスを戻して、どうすべきかを決定させるようにします。
予期しないプログラム例外が発生しないように DLL コードを記述し、万が一発生した場合の対処も考えておくようにします。例外を最も効果的に処理する方法は、例外が発生したときに Windows* 構造化例外処理サポートを使用して、制御を得ることです。すべての DLL ルーチン呼び出しを C の try/except 構造でラップし、except() フィルター式に応答方法を決定するルーチンを呼び出させます。
DLL で発生する浮動小数点トラップ条件をどのように処理するかを考える前に、トラップが発生するように、トラップをアンマスクする方法について考える必要があります。/fpe:3 でコンパイルし、浮動小数点ステータスワードをポーリングして例外をチェックする場合、トラップをアンマスクする方法を考慮する必要はありません。このような場合は、トラップをアンマスクしません。
ただし、/fpe:0 でコンパイルし、浮動小数点例外をトラップする場合、浮動小数点コントロール・ワードのトラップをアンマスクする作業が必要になります。これは、多くの言語がデフォルトでトラップをマスクするためです。
Fortran コンソールまたは Fortran QuickWin (またはスタンダード・グラフィックス) アプリケーションでは、自動的にトラップがアンマスクされます。これは、Fortran ランタイムシステムがメインプログラムを提供し、実際のアプリケーション・コードが実行される前にプロローグコードを実行する MAIN__ を呼び出すためです。ほかの言語により呼び出される Fortran DLL では、この処理は行われません。言語により初期化環境は異なります。目的に合った、最適な環境を構築するようにしてください。