Fortran子程序变量作用域及全局变量修改相关技术问题
Fortran子程序常见问题解答
1. 子程序中变量的作用域
- 子程序内显式声明的变量属于局部变量,仅在该子程序内部有效,与主程序或其他子程序的同名变量相互独立。
- 若开启
implicit none(推荐写法),子程序中未显式声明的变量会触发“Symbol has no IMPLICIT type”错误;未开启时,会按I-N规则隐式推断变量类型,但这种写法易出错,不建议使用。
2. 子程序能否修改主程序变量?
可以,但需采用正确的变量关联方式:
- 你提供的示例中,子程序
changstr内部重新声明了stringvar,这是局部变量,修改它只会改变子程序内的值,主程序的同名变量不受影响,因此退出子程序后主程序变量恢复原值。 - 要修改主程序变量,常用两种方法:
- 参数传递:将主程序变量作为实参传入子程序,利用Fortran默认的引用传递特性,修改形参即可同步修改主程序变量。
- 全局变量共享:通过模块或COMMON块(老旧方式)让主程序和子程序共享变量定义。
参数传递修改主程序变量示例
program subroutines implicit none character*20 :: stringvar stringvar='first' print *,stringvar call changstr(stringvar) print *,stringvar end program subroutine changstr(str) implicit none character*20 :: str print *,'in sub' str='second' print *,str end subroutine changstr
3. 避免全局变量的“Symbol 'xxx' has no IMPLICIT type”错误
若想通过全局变量(无需参数传递)修改主程序变量,推荐使用模块管理全局变量,这是现代Fortran的标准做法:
- 在模块中声明全局变量;
- 主程序和子程序通过
use语句引入该模块,共享变量的类型定义,即可避免未定义错误。
模块实现全局变量示例
module global_vars implicit none character*20 :: stringvar end module global_vars program subroutines use global_vars implicit none stringvar='first' print *,stringvar call changstr print *,stringvar end program subroutine changstr() use global_vars implicit none print *,'in sub' stringvar='second' print *,stringvar end subroutine changstr
老旧COMMON块实现(不推荐)
如果必须使用传统COMMON块,需在主程序和子程序中用相同的COMMON语句声明变量,保证类型、顺序一致:
program subroutines implicit none character*20 :: stringvar common /shared_str/ stringvar stringvar='first' print *,stringvar call changstr print *,stringvar end program subroutine changstr() implicit none character*20 :: stringvar common /shared_str/ stringvar print *,'in sub' stringvar='second' print *,stringvar end subroutine changstr
内容的提问来源于stack exchange,提问作者kris44dad
相关产品推荐
相关产品推荐

