fortran - 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
- 在声明中,名称只是“标签”,对吗?它们不需要匹配主程序中变量的名称。
- 参数的类型维度也不需要与主程序中的匹配,对吗?那么子例程中的 arg1(一个数组)在 inout 变量的情况下也可以是一个实数?他们只需要匹配子程序内部的声明吗?这是否仅适用于 intent(in) 参数?
- 即使变量是“inout”并且与主程序中的变量完全匹配,是否需要在子程序中声明变量?
- 命名子例程或函数的参数和变量时有什么好的做法?是否应该使用不同的名称来将它们与主程序区分开来?我对这个问题很好奇,尤其是对于所有变量(输入输出)。
解决方案
1) 是:实际参数的名称不必与虚拟参数的名称匹配。
2)是和否:声明参数的大小必须至少小于或等于实际参数的大小(不严格精确......)。请注意,声明虚拟参数的维度存在多种方式;建议的是,它需要一个显式接口,在您的情况下是 (:),它允许子例程使用内部 SIZE 函数获取确切的大小或参数。
3)是的,他们需要:意图条款无关紧要。intent(inout) 仅添加对编译器的检查。
4) 没有一般规则。我的规则:如果一个子程序在代码中只被调用一次(或几个调用语句),那么通常名称应该匹配。这更容易理解。
推荐阅读
- python - 在文本文件中查找 _sre.SRE_Pattern 的最后一次出现
- java - 如何使用 MusicKit SDK for Android 播放歌曲
- angular - 形式:手动触发valueChange
- android - 将现有 AWS Amplify 项目集成到 Android 项目中
- java - 将改造原始响应作为 json 对象返回而不转换为任何特定类型的对象?
- typescript - 无法使方法重载与歧视性联合一起工作。怎么了?
- http - HTTP-header 中的 User-Agent 包含三种不同的浏览器,谁是对的?
- android - 如果应用程序被滑动杀死,如何停止所有通知和警报?
- python - math.gcd() 与欧几里得算法
- c++ - 如何使用 C/C++ 获取硬盘的运行时间