我正在尝试使用Fortran 90中的DATA
语句初始化数组。代码如下:
PROGRAM dt_state
IMPLICIT NONE
INTEGER :: a(4), b(2:2), c(10)
DATA a/4*0/
WRITE (6,*) a(:)
DATA a/4,3,2,1/
WRITE (6,*) a(:)
END PROGRAM dt_state
我预计屏幕上的结果将为0 0 0 0
和4 3 2 1
。但是,我得到的是0 0 0 0
和0 0 0 0
。这意味着DATA
语句不会覆盖a
的值,是吗?
答案 0 :(得分:6)
变量只能出现在DATA语句中一次。 DATA语句用于初始化,在程序启动时只执行一次。
在可执行代码中使用赋值来设置数组值
a = (/ 4, 3, 2, 1 /)
(在Fortran 90中)
或
a = [ 4, 3, 2, 1 ]
(在Fortran 2003中)。
最好也将此语法用于初始化。
答案 1 :(得分:2)
您的代码不符合标准。那就是:从F2008 5.2.3:
变量或变量的一部分不得在程序中多次显式初始化。
DATA
语句(是一件事)执行这样的显式初始化(5.4.7.1),因此特别是两个不能出现在同一个变量中。
对于第二次“初始化”,请使用赋值。 [正如@VladimirF所提出的那样,打字员的速度比我快。]此外,虽然可以将DATA
语句与可执行语句放在一起,但就像在这种情况下一样,该标准甚至可以使其过时(B.2.5) ):
在可执行语句中定位DATA语句的能力很少使用,不必要,也是潜在的错误来源。
由于代码是非标准的,并且错误不是编译器需要检测的错误,因此编译器可以随意使用代码。我认为通过一些小选择来看看我们看到的内容会很有趣:
当然,人们不希望依赖任何这些行为,即使它是理想行为。