2011-06-28 142 views
4

在Fortran中,变量的声明语句是否可以引用先前声明的变量?例如,当我尝试以下方法:在Fortran 90中,是否无法在新变量的声明语句中引用先前声明的变量?

PROGRAM test3 
    IMPLICIT NONE 

    INTEGER :: a=2286 
    INTEGER :: b=a/3 

    WRITE(*,*) a, b 
END PROGRAM test3 

我得到一个编译时错误消息:

test3.f90:5.16: 

    INTEGER :: b=a/3 
       1 
Error: Parameter 'a' at (1) has not been declared or is a variable, which 
does not reduce to a constant expression 

在另一方面,如果我给你b在/ 2b申报单独的声明中,它编译和运行良好:

PROGRAM test3 
    IMPLICIT NONE 

    INTEGER :: a=2286 
    INTEGER :: b 
    b=a/3 

    WRITE(*,*) a, b 
END PROGRAM test3 

这给了我正确的输出:

2286   762 

为什么会出现这样的情况 - 即已声明的变量不能包含在新变量的声明语句?难道我做错了什么?或者这只是一个“Fortran生活事实”?

非常感谢您的时间!

回答

6

错误消息非常明确。在变量声明中使用的初始化器必须是常量值。在你的例子中,a不是一个常量。

它应该是这样的:

PROGRAM test3 
    IMPLICIT NONE 

    INTEGER, PARAMETER :: a=2286 
    INTEGER :: b=a/3 

    WRITE(*,*) a, b 
END PROGRAM test3 

因为那时a是一个常数。

+0

谢谢! – Andrew

3

将“,参数”添加到“a”的声明中。这将允许您在另一个声明中使用a的值。这也意味着“变量”a的值不能改变。

+0

谢谢亲切! – Andrew

8

让我补充一件事:初始化变量像这样的作品在主要方案和参数(当然,你初始化它们像这样的参数),但它可以用自己的行为会让你大吃一惊,如果你太习惯使用它,并开始在子程序和函数使用它:

例如,我们大多数人会首先假设此程序:

program foo 

    call bar 
    call bar 

contains 

    subroutine bar 
    integer :: i=3 

     print '(A,I3)','At start of bar: i = ', i 
     i = i + 1 
     print '(A,I3)','At end of bar: i = ', i 
    end subroutine bar 

end program foo 

将打印

At start of bar: i = 3 
At end of bar: i = 4 
At start of bar: i = 3 
At end of bar: i = 4 

---但它没有。它打印

At start of bar: i = 3 
At end of bar: i = 4 
At start of bar: i = 4 
At end of bar: i = 5 

这是出于“历史原因”,因为事情往往是当他们提出的行为看起来明显错误。初始化在声明一个变量实质上是将这样的:

integer :: i 

integer, save :: i = 3 

和初始化完成仅在第一次。这意味着第二次通过,变量会记住它以前的值(4)并增加它。

所以我写这篇文章的原因基本上是为了警告你在申报时不要过于舒适地初始化变量。我建议在参数和主程序中(因为您只输入一次主程序而不会遇到此问题)以及其他一些问题。

+0

哇,这是非常有帮助的。感谢您指出这一点;我会牢记这一点。 – Andrew