有没有办法在元素函数中进行参数检查?

时间:2018-03-20 20:11:05

标签: fortran fortran90 fortran95

实施例

假设我想编写一个检查其参数的元素函数,如下面的玩具示例所示:

elemental real function square_root( x )
    real, intent(IN) :: x
    if (x<0) then
        print *, "Error in square_root(): the variable x must be non-negative."
        stop 1
    endif
    square_root = sqrt(x)
end function square_root

动机

将过程标记为elemental允许灵活的语法:我可以使用标量或多维数组调用它,而不会改变调用语法。这太棒了。

检查参数值通常是一种很好的做法,过去对我帮助很大。

难度

此示例无法编译,因为elemental过程也必须是pure过程,并且pure过程中不允许I / O和程序终止。

似乎我可以执行以下任一操作,但不能同时执行以下操作之一:

  • 使函数检查其输入并抛出某种错误/异常
  • 将函数标记为elemental

问题

是否有任何方法来获取elemental提供的灵活语法,同时还检查参数值?

我很高兴使用较新的Fortran标准的功能和/或在必要/可能的情况下调用多态(例如通过接口),但我希望有一种更简单的方法!

1 个答案:

答案 0 :(得分:4)

如果您希望避免信号错误或参数(对于子程序)或函数结果(对于函数) 1 的异常情况,那么有以下选项:

    来自Fortran 2008的
  • 元素程序不一定是纯粹的;
  • 来自Fortran 2018的
  • error stop语句提示的错误终止可以在纯子程序 2 中开始。

可以使用impure前缀:

指定非纯的元素函数
impure elemental function can_io_stdout(x)
  ..
  print *, "Hello!"
end function

对于Fortran 2018(即将发布):

elemental function can_terminate(x)
  ..
  error stop "Termination from a pure function"
end function

1 例如,在真实的平方根的情况下,可以选择返回NaN。

2 正如IanH所指出的那样,即使在早期的语言版本中,也可以通过error stop之外的方式在纯过程中出现错误终止。