Can I return a value from a function prematurely in Fortran?

此生再无相见时 提交于 2021-02-05 08:09:16

问题


In C I can easily return a value from a function:

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

But in Fortran the RETURN statement serves error handling. I could do

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

How do I do this in modern Fortran?

I know that in this case and if-then-else-endif would suffice. But there are cases when it wouldn't and I don't want to make an overly complex example.


回答1:


In Fortran you use the return statement to exit a procedure.




回答2:


As noted in the earlier answer, the return statement completes execution of a procedure (strictly, a subprogram). To explicitly give an example suited to the question

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

completes the function immediately if that condition is met.

However, in this case this doesn't actually give us legal Fortran code, and certainly not want we want, and we need to do a little more.

Whenever a function completes, the function result, if not a pointer, must have its value defined. That value takes the place of the function reference in the calling scope. [If it is a pointer, then the requirement is that the function result must not have its pointer association status undefined.]

Now, the function result is called foo in this case. As long as we assign to foo before we return the function will return the given value. For example:

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

or

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

Note that, rather than calculating a and then just before the end function assigning to foo, we can just assign directly to foo. If you understand that then the "premature return of a value" becomes quite intuitive.



来源:https://stackoverflow.com/questions/42097550/can-i-return-a-value-from-a-function-prematurely-in-fortran

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!