2012-04-18 16 views
2

私はgfortranをいくつかのコードに使用しています。しばらくの間、私はgfortranは浮動小数点例外について警告します

-ffpe-trap=zero,overflow,invalid 

といくつかのバグを見つけようとしています。これにより、私のプログラムは即座に実行を停止します。 FPEが正常な場合があり、フラグは次のようになります。

-ffpe-warn=zero,overflow,invalid 

非常に便利です。 gfortran(または他のコンパイラ)は、このようなものを提供していますか?そうでない場合、回避策はありますか?私の現在の考えは、警告を書き出すためのシグナルハンドラを登録するC関数を作成することですが、どうやってそれを行うのか分かりません。

+1

この推定ランタイム警告メカニズムはどのように機能しますか? –

+3

gfortranは(比較的新しい)ieee_arithmetic組み込みモジュールを提供していますか?そうであれば、Fortranで独自のf-p「エラー」トラッピングを行うために必要なツールが提供されます。 –

+0

@DavidHefferman実行時例外が発生すると、実行が停止し、例外が発生した場所とプログラムが終了した場所に関するメッセージが出力されます。例外が発生した場所(stderrのメッセージかもしれません)と実行が続行されるように通知するのがいいだけです。たぶんそれは可能ではない...私はこれらのことがどう機能するかについてあまり知らない... – mgilson

答えて

4

浮動小数点例外が発生した場合の警告方法はわかりません。しかし、gfortranとifortの両方にシグナル処理ルーチンがあります。例えば、signalと のインテルFortranコンパイラーUser and Reference Guides (warning: large PDF)(区の410ページを参照)のgfortranの資料を参照してください。あなたはsignalを呼び出して、信号のための次のいずれかのアクションを確立することができ

  • は(番号で識別)指定された信号を無視します。
  • 指定された信号に対してデフォルトのアクションを使用します。これにより、以前に確立されたアクションがリセットされます。
  • 指定された信号から、名前で指定された信号を受信する手順に制御を移します。あなたのケースでは

、あなたは浮動小数点例外は、(例えば、印刷ファイル名/行番号)が発生し、上記リストの3番目のオプションを使用するときに何かをする関数を書きたいと思います。

残念ながら、これはあまり移植性がありません。さまざまなコンパイラのシグナル処理の例については、this pageをご覧ください。あなたは

  • にしたい場合は、更新

(参照-NDEBUG)いくつかのプリプロセッサフ​​ラグが設定されている場合のみ、信号処理ルーチンを使用する複数のコンパイラ
  • でコンパイルプリプロセッサマクロでいくつかのコードをラップすることができ:最終的に、ieee_exceptions組み込みモジュールの例外処理機能は、ハイパフォーマンスマークで示唆されているように、これを実行するポータブルな方法になります。

  • +0

    Fortranのシグナル処理について知っておいてよろしいですが、もう少し標準化されているので、おそらくCでその部分をやっていますが。私はまだ行番号/ファイル名/例外を発生させたstacktraceを取得する方法が全くわかりません。ちょっとしたことでグーグルで行くと、かなり面倒なビジネスになると思います。 – mgilson

    関連する問題