首页 > 解决方案 > Fortran 子例程/函数参数名称和声明

问题描述

关于传递给 Fortran 中的子例程/函数的参数,我有一些一般性问题,尤其是在非局部变量的命名方面。

鉴于这个主程序

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. 参数的类型维度也不需要与主程序中的匹配,对吗?那么子例程中的 arg1(一个数组)在 inout 变量的情况下也可以是一个实数?他们只需要匹配子程序内部的声明吗?这是否仅适用于 intent(in) 参数?
  3. 即使变量是“inout”并且与主程序中的变量完全匹配,是否需要在子程序中声明变量?
  4. 命名子例程或函数的参数和变量时有什么好的做法?是否应该使用不同的名称来将它们与主程序区分开来?我对这个问题很好奇,尤其是对于所有变量(输入输出)。

标签: fortran

解决方案


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

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

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

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


推荐阅读