我正在将用F77编写的旧源代码修改为F90。我很苦恼地整理出哪些变量是意图(in)、意图(out)和意图(inout)。
你有任何指导或提示吗?
非常感谢您的任何想法和建议。
迈克尔
我正在将用F77编写的旧源代码修改为F90。我很苦恼地整理出哪些变量是意图(in)、意图(out)和意图(inout)。
你有任何指导或提示吗?
非常感谢您的任何想法和建议。
迈克尔
如果实际参数是一个变量,intent (inout)
将始终有效(参见 Fortran intent(inout) versus omitting intent),但不提供程序员和编译器任何信息。也没有必要指定 intent
属性,因此您可以逐步改进代码。如果变量仅出现在赋值语句的 RHS 上,则最好使用 intent (in)
。如果只出现在 LHS 上,则使用 intent (out)
。如果变量用作一个或多个过程调用的参数,则需要跟踪该过程中的使用情况,这使得问题更加复杂。因此,建议从最低级别的过程开始,并逐步提高。大多数编译器都会警告错误,例如将值分配给 intent (in)
参数。为了使编译器检查各个过程之间的一致性,每个被调用的过程的接口都需要对调用者明确。最简单的方法是将您的过程放入一个模块或多个模块中,并 "use" 该模块。同一模块中的过程之间的接口是明确的。
Alan Miller编写了一个名为to_f90.f90的程序,可以自动处理格式良好的F77代码。他的网站有一个镜像地址:
http://jblevins.org/mirror/amiller/
具体的例程位于:
如先前所述,intent(inout) 应该总是可以工作。
我建议对于变量 X 的 intent(in) 和 intent(out),在你的子程序中进行搜索(使用 CTRL+F 或其他方式)查找 "X =" 和 "X="。这样,你将能够检查变量是否在执行此子程序期间被修改。如果没有:intent(in)。这始终是正确的,但如果变量在子函数或调用另一个例程时被修改,则不是。因此,首先要检查是否在正在翻译的子程序中调用了函数或例程。