回 帖 发 新 帖 刷新版面

主题:fortran程序中声明语句 AUTOMATIC (***,**,**)什么意思

fortran子程序如下: INTEGER IL1,IL2,ILG,ILEV,fn_trchem,MSG
      INTEGER chem_loc(fn_trchem)

      REAL XROW(ni,nk,fn_trchem),PBLTROW(ni)
#include "chem_conv_point.cdk"

C   -------------------------------------------------------L
      INTEGER JLATPR,NUPS,ITRAC,IRAD,ik1
      AUTOMATIC (TFROW, real, (NI,NK))

      AUTOMATIC (TCVROW, real, (NI))
      AUTOMATIC (WRK, real, (IDSZ))
      AUTOMATIC (VA, real, (IVA))

      AUTOMATIC (ZCLFROW, real, (NI,(nk-1),2))
      AUTOMATIC (ZLWCROW, real, (NI,(nk-1),2))
      AUTOMATIC (DQLDT, real, (NI,(nk-1)))
      AUTOMATIC (DQLDTG, real, (NI,(nk-1)))
编译时出错,信息如下:
AUTOMATIC行 (S) Syntax is incorrect.
AUTOMATIC行 Incorrect character found in source at line 33 in column 7.  Hexadecimal value of character is 7E.
请教各位大侠,是什么错误

回复列表 (共2个回复)

沙发

automatic 的意思是,限定这些变量分配在堆栈区。

与它相对应的是 static,它限制这些变量分配在静态数据区。

理解这两个概念,你可以借鉴 C 语言的 static。或者了解 PE 格式以及堆栈的概念。

通常来说,子程序内的局部变量是在堆栈中的。
程序运行至子程序时,会将所有实参压入堆栈,然后调整堆栈顶部,并以留出足够的局部变量。
在从子程序返回时,再改回之前的堆栈顶。这样刚才的实参和局部变量就进入堆栈上方,继续循环利用。

此时,子程序内的局部变量无法得到保存,因为在下一个子程序运行时,他们被回收利用。

而保存在静态数据块的数据,由编译器写入 .data 区段,程序运行时映射到相对固定的内存地址。在整个程序运行时,均有效,并保存有效的数据,直到程序完全退出。

automatic 和 static 这两个用法,都不是 Fortran 语言标准的规定,而是某些编译器扩展的功能。

板凳


多谢多谢!以后还请多多赐教!

我来回复

您尚未登录,请登录后再回复。点此登录或注册