Fortran 90数据语句不会覆盖数据

时间:2014-02-17 13:20:09

标签: arrays fortran fortran90

我正在尝试使用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 04 3 2 1。但是,我得到的是0 0 0 00 0 0 0。这意味着DATA语句不会覆盖a的值,是吗?

2 个答案:

答案 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语句的能力很少使用,不必要,也是潜在的错误来源。

由于代码是非标准的,并且错误不是编译器需要检测的错误,因此编译器可以随意使用代码。我认为通过一些小选择来看看我们看到的内容会很有趣:

  • 一个拒绝编译(并指出了过时);
  • 两个人静静地继续前进,使用第一次初始化;
  • 一个人使用了第二次初始化,警告。

当然,人们不希望依赖任何这些行为,即使它是理想行为。