在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事实”?
非常感谢你的时间!
答案 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的值不能改变。