2

我正在为一些代码使用 gfortran。一段时间以来,我一直在编译

-ffpe-trap=zero,overflow,invalid

试图追捕一些错误。这会导致我的程序立即停止执行。在某些情况下,FPE 可能没问题,因此会出现如下标志:

-ffpe-warn=zero,overflow,invalid

会非常有用。gfortran(或任何其他编译器)是否提供类似的东西?如果没有,是否有任何解决方法?我目前的想法是创建一个 C 函数来注册一个信号处理程序来写出警告,尽管我不知道如何去做。

4

1 回答 1

4

我不知道遇到浮点异常时的警告方式。但是 gfortran 和 ifort 都有信号处理例程。例如,参见信号的 gfortran 文档和英特尔 Fortran 编译器用户和参考指南(警告:大 PDF)(参见 wards 上的第 410 页)。

您可以通过调用来为信号建立以下操作之一signal

  • 忽略指定的信号(由数字标识)。
  • 对指定信号使用默认动作,可以重置之前建立的动作。
  • 将控制从指定的信号转移到接收信号的过程,由名称指定。

在您的情况下,您可能希望编写一个函数来在发生浮点异常时执行某些操作(例如打印文件名/行号),并使用上面列表中的第三个选项。

不幸的是,这不是很便携:查看此页面以获取各种编译器的信号处理示例。如果您愿意,可以在预处理器宏中包装一些代码

  • 用多个编译器编译
  • 仅在设置了某些预处理器标志时才使用信号处理例程(参见-NDEBUG

更新:最终,内在模块的异常处理设施ieee_exceptions将是执行此操作的可移植方式,正如高性能标记所建议的那样。

于 2012-04-18T14:08:13.457 回答