我正在使用gfortran代码。有一段时间了,我一直在用
进行编译-ffpe-trap=zero,overflow,invalid
试图追捕一些错误。这导致我的程序立即停止执行。在某些情况下,FPE可能正常,因此标志如下:
-ffpe-warn=zero,overflow,invalid
会非常有用。 gfortran(或任何其他编译器)是否提供这样的东西?如果没有,有任何解决方法吗?我目前的想法是创建一个C函数来注册一个信号处理程序来写出警告,虽然我不知道如何去做。
答案 0 :(得分:4)
我不知道遇到浮点异常的警告方式。但是gfortran和ifort都有信号处理程序。例如,请参阅signal和User and Reference Guides (warning: large PDF)的gfortran文档 英特尔Fortran编译器this page(参见有关病房的第410页)。
您可以通过调用
为信号建立以下操作之一signal
- 忽略指定的信号(由数字标识)。
- 使用指定信号的默认操作,可以重置先前建立的操作。
- 将控制从指定信号转移到接收信号的程序,由名称指定。
在您的情况下,您可能希望编写一个函数来在发生浮点异常时执行某些操作(例如打印文件名/行号),并使用上面列表中的第三个选项。
不幸的是,这不是非常便携:请查看-NDEBUG
以获取各种编译器的信号处理示例。如果要
更新:最终,ieee_exceptions
内在模块的异常处理工具将是可执行此操作的便携式方法,如高性能标记所示。