FORTRAN在哪里存储局部变量?

时间:2013-03-14 16:03:51

标签: fortran local-variables

从商业程序程序员手册中发布的源代码中,我已经分离了一段令我困惑的代码片段。

下面的函数应该由内核多次调用,并且应该在由许多互连组件组成的系统中实现组件的时间行为(我已经从函数原型中删除了输入/输出参数,因为它们与我打算上升的观点无关。)

为了区分相同块类型的不同实例,内核在INFO(1)元素中传递实例编号。

据我所知,该程序的设计者花费了大量精力试图节省将参数值从PAR向量复制到每次调用时具有有意义名称的局部变量所花费的时间(就好像他们不知道编译器可以做的优化。在我看来,他们只想在第一次调用中将它们分配给局部变量,或者当调用者切换到同一类型的不同实例时。

但是,如果使用“save”关键字未将局部变量声明为静态,我无法理解这是如何工作的。 FORTRAN是否静态存储局部变量,即不在堆栈上? (我很抱歉,如果这个问题听起来很愚蠢,我已经习惯了C / C ++语言)

谢谢。

SUBROUTINE TYPE151(PAR, INFO, *)

    IMPLICIT NONE

    INTEGER*4 INFO(15), IUNIT
    DOUBLE PRECISION PAR, QMAX

    PARAMETER (NP=1)
    DIMENSION PAR(NP)

    ! First call
    IF (INFO(7).EQ.-1) THEN

        IUNIT = INFO(1)

        QMAX = PAR(1)

        RETURN 1
    ENDIF

    ! later calls
    IF(INFO(1).NE.IUNIT) THEN

        IUNIT = INFO(1)

        QMAX = PAR(1)
    ENDIF

    ! Making use of QMAX in some ways...

    RETURN 1 
END SUBROUTINE TYPE151

1 个答案:

答案 0 :(得分:2)

存储方法不是语言标准的一部分。旧的FORTRAN编译器(FORTRAN 77及更早版本)经常静态存储所有变量。该语言要求您对变量使用“SAVE”,在对过程的调用中应保留这些变量。但是许多程序员忽略了这一要求,并依赖于所有变量保留其值的行为,因为FORTRAN 77时代的编译器的典型设计。

现代Fortran编译器通常以不同方式使用内存,如果省略SAVE,则过程的局部变量并不总是保留其值。当使用当前编译器编译旧程序时,这经常会导致错误。编译器通常提供恢复旧行为的选项。否则,识别需要在其声明中添加SAVE属性的大型遗留程序中的所有变量可能需要做大量的工作。