假设我想编写一个检查其参数的元素函数,如下面的玩具示例所示:
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标准的功能和/或在必要/可能的情况下调用多态(例如通过接口),但我希望有一种更简单的方法!
答案 0 :(得分:4)
如果您希望避免信号错误或参数(对于子程序)或函数结果(对于函数) 1 的异常情况,那么有以下选项:
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
之外的方式在纯过程中出现错误终止。