我可以在Fortran中过早地从函数中返回一个值吗?

时间:2017-02-07 18:45:12

标签: fortran

在C中,我可以轻松地从函数返回一个值:

int foo(int b) {
   if (b == 0) return 42;
   int a;
   // calculate a
   return a;
}

但是在Fortran中,RETURN语句提供错误处理。我能做到

integer function foo(b)
    integer :: b, a
    if (b == 0) ! what should I enter here??
    // calculate a
    foo = a
end function

如何在现代Fortran中执行此操作?

我知道在这种情况下,if-then-else-endif就足够了。但有些情况下它不会,我不想做一个过于复杂的例子。

2 个答案:

答案 0 :(得分:3)

在Fortran中,您使用return语句退出过程。

答案 1 :(得分:1)

如前面的回答所述,return语句完成了一个过程的执行(严格地说,是一个子程序)。明确给出一个适合问题的例子

integer function foo(b)
    integer :: b, a
    if (b == 0) return
    !! calculate a
    foo = a
end function

如果满足该条件,则立即完成该功能。

然而,在这种情况下,这实际上并没有给我们合法的Fortran代码,当然也不想要我们想要的,我们还需要做更多的事情。

每当函数完成时,函数结果(如果不是指针)必须定义其值。该值取代了调用范围中的函数引用。 [如果它是一个指针,那么要求是函数结果的指针关联状态不能未定义。]

现在,在这种情况下,函数结果称为foo。只要我们在foo之前分配给return,函数就会返回给定的值。例如:

integer function foo(b)
    integer :: b, a
    foo = 42
    if (b == 0) return
    !! calculate a
    foo = a
end function

integer function foo(b)
    integer :: b, a
    if (b == 0) then
      foo = 42
      return
    end if
    !! calculate a
    foo = a
end function

请注意,我们可以直接分配给a,而不是计算end function,然后在foo分配给foo之前。如果你理解了那么"过早地返回一个值"变得非常直观。