2

一部のコードに gfortran を使用しています。しばらくの間、私はコンパイルしてきました

-ffpe-trap=zero,overflow,invalid

いくつかのバグを追い詰めようとして。これにより、私のプログラムはすぐに実行を停止します。FPE が問題ない場合もあるため、次のようなフラグが表示されます。

-ffpe-warn=zero,overflow,invalid

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

4

1 に答える 1

4

浮動小数点例外が発生したときに警告する方法がわかりません。しかし、gfortran と ifort の両方にシグナル処理ルーチンがあります。たとえば、signal の gfortran のドキュメントインテル Fortran コンパイラのユーザーおよびリファレンス ガイド (警告: 大きな PDF)を参照してください (wards については 410 ページを参照してください)。

への呼び出しを使用して、シグナルに対して次のいずれかのアクションを確立できますsignal

  • 指定されたシグナル (番号で識別) を無視します。
  • 指定されたシグナルに対してデフォルト アクションを使用します。これにより、以前に確立されたアクションをリセットできます。
  • 指定されたシグナルから、名前で指定されたシグナルを受信するプロシージャーに制御を移します。

あなたの場合、浮動小数点例外が発生したときに何かを行う関数を作成し (たとえば、ファイル名/行番号を出力する)、上記のリストの 3 番目のオプションを使用する必要があります。

残念ながら、これはあまり移植性がありません。さまざまなコンパイラのシグナル処理の例については、このページを参照してください。必要に応じて、一部のコードをプリプロセッサ マクロでラップできます。

  • 複数のコンパイラでコンパイルする
  • 何らかのプリプロセッサ フラグが設定されている場合にのみ、シグナル処理ルーチンを使用します (参照-NDEBUG) 。

更新:最終的に、ieee_exceptions組み込みモジュールの例外処理機能は、High Performance Mark によって提案されているように、これを行うための移植可能な方法になります。

于 2012-04-18T14:08:13.457 に答える