Fortran subroutine/function 参数名称和声明

Fortran subroutine/function arguments names and declaration

我有一些关于在 Fortran 中传递给 subroutine/function 的参数的一般性问题,特别是在非局部变量的命名方面。

给出这个主程序

program xfunc
   implicit none
   real, dimension(5) :: var1, var2
   integer, var3
  ...
  call my_subroutine(var1(i),var2,var3)

SUBROUTINE my_subroutine(arg1,var2,arg3)
    !inout variable not matching the var1 declared in main
    real, intent(inout) :: arg1
    !matches the name and dimension of variable in main, is this needed?
    real, intent(inout), dimension(5) :: var2
    !should arg3 be named var3 since it overwrites the values in var3? And should arg3 have a corresponding variable in the main program
    integer, intent(out) :: arg3
    
end my_subroutine
  1. 声明中的名称只是“标签”,对吗?它们不需要与主程序中的变量名称相匹配。
  2. 参数的类型维度也不需要与主程序中的相匹配,对吗?那么在 inout 变量的情况下,子例程内的 arg1(数组)也可以只是一个真实的?他们只需要匹配子例程内的声明?这是否仅适用于 intent(in) 参数?
  3. 是否需要在子程序中声明变量,即使它们是“inout”并且与主程序中的变量完全匹配?
  4. 命名子例程或函数的参数和变量时有什么好的做法?是否应该使用不同的名称来区别于主程序?我对这个问题很好奇,尤其是对于所有 (inout 和 out) 的变量。

1) 是:实际参数的名称不必与伪参数的名称匹配。

2) 是和否:声明参数的大小必须至少小于或等于实际参数的大小(不严格准确......)。请注意,存在多种方式来声明伪参数的维度;建议的是,它需要一个显式接口,在您的情况下是 (:),它允许子例程使用内部 SIZE 函数获取确切的大小或参数。

3) 是的,他们需要:意图条款无关紧要。 intent(inout) 只增加编译器的检查。

4) 没有一般规则。我的规则:如果一个子程序在代码中只被调用一次(或几次调用语句),那么通常名称应该匹配。这样比较容易理解。

这是一个关于参数关联的问题。争论的意图在很大程度上与本次讨论无关。

在过程(子程序或函数)声明中,"labels" 是将过程作为其作用域的实体的 名称。在问题的 my_subroutine 声明中,这些实体的名称为 arg1var2arg3。这些是过程的 伪参数 。这些虚拟参数的名称与其他范围内的实体名称完全无关(或多或少,任何不是该过程的东西)。参数意图不影响命名或关联。

其他范围内的实体,比如题目的主程序,是不同的东西。然而,当存在过程引用时,例如子例程调用,在引用位置的参数(实际参数)和过程本地实体(同样是伪参数)之间建立了关联。名称不是此关联中的一个因素:实际参数和伪参数不需要具有相同的名称。事实上(无论意图如何),实际参数甚至不需要是名称。

在每个作用域(主程序、过程)中使用相应的名称。

作为参数关联的一部分,我们不会简单地说"argument 1 in the main program is the same thing as argument 1 in the procedure"。这有很多方面,但我们可以在这里说这意味着(对子问题 2 的回应):虚拟参数和实际参数通常不需要具有相同的形状(元素数量或等级)。在许多情况下,对形状有限制。意图不是这里的一个因素。在过程内部,伪参数具有其声明的特征,独立于实际参数的特征(除了可能存在的任何匹配限制外)。

此外,可以使数组元素实际参数对应于数组伪参数(但不是标量实际参数)。这使用 存储关联,您可以在此处看到许多其他问题。

相反,对于非元素过程,数组实际参数不可能对应于标量伪参数。

如果实体不是过程的虚拟参数,则必须存在某种其他形式的关联才能使主程序的实体在过程范围内可访问。这可能是 host 关联、use 关联、storage 关联(或 linkage协会)。在任何情况下,如果不声明为伪参数,实体就不是伪参数。同样,意图在这里不起作用。

我不会触及子问题 4(相当主观),只是说当不同范围内的实体具有不同的名称时,帮助用户调试有问题的代码要容易得多:"the dummy variable x of function foo, which is argument associated with actual argument x in the main program, which is in term use associated with module variable x of bar" 有点乏味保持直线。