Fortran返回语句

3
我将尝试将一些在g77下编译良好的代码编译到gfortran下。问题似乎出现在一个return语句上:
ffuncs.f:934.13:
  RETURN E
         1

错误:在(1)处的备用RETURN语句需要一个SCALAR-INTEGER返回说明符。

在代码中,任何E都被指定为real*8:

IMPLICIT REAL*8(A-H,O-Z)

然而,E从未被赋值或者说你直到return语句才看到它。我对Fortran几乎一无所知。在Fortran中带有参数的return语句的含义是什么?

谢谢。

3个回答

8
在FORTRAN中(直到我非常熟悉的Fortran 77版本),RETURN n不用于返回函数值;相反,它类似于其他语言中处理异常的方式:退出到与正常位置不同的代码位置。通常,您会使用标签作为参数调用这样的SUBROUTINEFUNCTION,例如:
  CALL MYSUB(A, B, C, *998, *999)
...
998 STOP 'Error 1'
998 STOP 'Error 2'

如果MYSUB出现问题,你需要执行RETURN 1RETURN 2(而不是正常的RETURN),这样你将直接跳转到调用程序中标签为998或999的位置。

这就是通常希望在RETURN语句中使用整数的原因 - 它不是一个值,而是指定要执行哪个错误退出的索引。

RETURN E对我来说听起来不太对。除非有我不知道的语法,否则先前的编译器应该会将其标记为错误。


嗨,是的,在我进一步探索后我得出了这个结论。该调用只有一个指定的备选标签,所以我认为我可以仅仅使用返回 1谢谢你的回答。 - Brandon
我曾经看到一份旧编译器的文档,表明它会接受一个real类型变量,并将其转换为整数。因此,这可能在某个地方对某个人起作用了。 - agentp

2
在Fortran函数中,通过将值赋给与函数同名的虚拟变量来返回该值。一旦完成此操作,只需返回即可。

2
我认为@Carl Smotricz已经给出了答案。ffuncs的参数列表是否有虚拟参数,这些虚拟参数是星号(以匹配调用中的星号标签)?还是在没有备选返回的情况下使用了这个功能?如果没有备选返回,只需删除“E”。如果有备选返回,则最大的问题是程序在运行时做了什么,因为变量的类型错误且未初始化。如果变量没有与预期分支之一匹配的整数值,也许程序会执行常规的返回分支——但这只是一个猜测——如果是这样,简单的解决方法是再次删除“E”。
语言标准认为“备用返回”功能是“过时的”,可能会在将来的标准中被删除;如果它被删除,编译器可能会继续支持它,因为存在遗留代码。对于新代码,一个简单的替代方案是返回一个整数状态变量,并在调用者中使用“select case”语句。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接