在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
就足够了。但有些情况下它不会,我不想做一个过于复杂的例子。
答案 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
之前。如果你理解了那么"过早地返回一个值"变得非常直观。