回 帖 发 新 帖 刷新版面

主题:DATA 赋值的疑惑

program ee
      integer a(2,2)
      data a/4*1/
      data ((a(i,j),i=1,2),j=1,2)/1,2,3,4/ 
      write(*,*) a(1,1), a(1,2)
      write(*,*) a(2,1), a(2,2)
      end

用ivf 编译,输出结果是
1    1
1    1

用compaq fortran 或老的编译器编译,输出是
1    2
3    4

差异就在于第二个data赋值是不是把第一个data覆盖掉,我的程序有a(21,21)  441个已知数据,大部分是1.0, 有几个是非1.0的数,查错的时候才发现ivf有这个问题,请问应该采取什么有效、快捷的方法,才能使这样的data赋值在各种编译器上顺利通过。

谢谢大家了。

回复列表 (共2个回复)

沙发

不同的编译器使用不尽相同的标准执行这一语句,所以,熟悉编译器的特点加以利用,并避免出错、歧义。

板凳

我回答问题喜欢引经据典: The Fortran 2003 Handbook P136

Explicit initialization also can be specified in a DATA statement.
1. An object, or the same part of an object, must not be explicitly initialized more than
once in a program.

Data 语句相当于对变量进行初始化; Fortran 禁止对同一变量进行两次初始化;
不同的编译器对此可能有扩展,但用 Fortran Standard Check 的话,应该会出来 Warnning 的。
至于其扩展时,是否按赋值语句那样逐条执行,则是不一定的。

总是一句话,你的程序不符合 Fortran 标准,有 Bug。

我来回复

您尚未登录,请登录后再回复。点此登录或注册