在Fortran 90中,是否不可能在新变量的声明语句中引用先前声明的变量?

时间:2011-06-28 16:51:45

标签: fortran declaration

在Fortran中,变量的声明语句是否可以引用先前声明的变量?例如,当我尝试以下操作时:

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 声明分开的声明中将 b 指定给 a / 2 ,它会编译并且运行良好:

PROGRAM test3
  IMPLICIT NONE

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

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

给了我正确的输出:

2286         762

为什么会这样 - 先前声明的变量不能包含在新变量的声明语句中?难道我做错了什么?或者这只是“生活中的Fortran事实”?

非常感谢你的时间!

3 个答案:

答案 0 :(得分: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)并递增它。

所以我写这篇文章的理由基本上是警告你不要在声明时初始化变量。我建议为参数和主程序(你不会遇到这个问题,因为你只输入一次主程序)和其他一点。

答案 1 :(得分:6)

错误消息非常明确。在变量声明中使用的初始值设定项必须是常量值。在您的示例中,a不是常量。

它应该像这样工作:

PROGRAM test3
  IMPLICIT NONE

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

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

因为a是常数。

答案 2 :(得分:3)

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