Windows下gfortran声明多组变量时编译错误求助
嘿,这个问题本质是Fortran的核心语法规则问题——不管是Linux还是Windows下的gfortran,都会严格遵守这个规则,你之前在Linux没遇到,大概率是没写过这种在执行语句后插变量声明的代码。咱们逐个解答你的问题:
i) 代码是否存在错误?
肯定有错误,你的错误代码违反了Fortran 95的语法规范。
ii) 错误产生的原因是什么?
Fortran(包括95标准)要求:在同一个程序块里,所有变量声明语句必须放在执行语句的前面。你看错误代码里,已经写了WRITE(*,*) C这种执行语句(赋值、输入输出都属于执行语句)之后,又加了REAL:: D的声明,这就踩了语法红线。
编译器首先会报错Unexpected data declaration statement,意思是“不该在这儿出现变量声明”;后面的D = 4.0因为D没被正确声明,自然就会跟着报Symbol 'd' has no IMPLICIT type的错误。
补充一句:虽然Fortran 2008引入了BLOCK结构允许在代码块内声明变量,但你的gfortran 6.3.0对F2008的支持不算完整,而且你明确用的是F95代码,所以这个特性暂时不适合你。
iii) 如何解决这个错误?
给你两种靠谱的解决方法,优先选第一种,完全符合F95规范:
方法1:把所有变量声明移到程序最开头(推荐)
把所有变量声明都放在IMPLICIT NONE之后,所有执行语句(赋值、WRITE这些)之前。修正后的代码如下:
program test IMPLICIT NONE ! 所有变量统一在这儿声明 REAL:: A,B,C,D ! 从这儿开始写执行逻辑 A = 1.0 B = 2.0 C = 3.0 WRITE(*,*) A * B WRITE(*,*) C D = 4.0 WRITE(*,*) D end program test
方法2:用代码块(适合支持F2008的新版本编译器)
如果你能升级gfortran版本,或者愿意启用F2008特性,可以用BLOCK块包裹后续代码,在块内单独声明变量:
program test IMPLICIT NONE ! 第一组变量声明 REAL:: A,B,C A = 1.0 B = 2.0 C = 3.0 WRITE(*,*) A * B WRITE(*,*) C ! 用BLOCK创建新的作用域,在里面声明D BLOCK REAL:: D D = 4.0 WRITE(*,*) D END BLOCK end program test
要是用这个方法,记得给gfortran加编译选项-std=f2008来启用F2008标准支持。
内容的提问来源于stack exchange,提问作者SYN

