gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:10:10 26 4
gpt4 key购买 nike

在 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 a/2 在与 的声明分开的声明中b ,它编译并运行良好:
PROGRAM test3
IMPLICIT NONE

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

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

这给了我正确的输出:
2286         762

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

非常感谢您的宝贵时间!

最佳答案

让我再补充一点:在主程序和参数中初始化这样的变量(好吧,你必须像这样为参数初始化它们),但如果你太习惯使用它,它的行为会让你感到惊讶并开始在子程序和函数中使用它:

例如,我们大多数人最初会假设这个程序:

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) 并增加它。

所以我写这个的原因基本上是警告你不要在声明时太舒服地初始化变量。我建议在参数和主程序中执行此操作(您不会遇到此问题,因为您只输入一次主程序)和其他小程序。

关于fortran - 在 Fortran 90 中,是否不可能在新变量的声明语句中引用先前声明的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6510161/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com