主题:[讨论]data给数组赋初值遇到的问题
hint1412
[专家分:20] 发布于 2011-11-12 12:19:00
program ex_20111111
implicit none
integer(4) :: a(5)
data a(1:3) /3*1/
data a(1:4) /-1,-1,-1,2/
end
在这个程序里面,后一个data赋值不是应该把前面一个覆盖了吗?
为何我编译之后,却显示
a(1) 1
a(2) -1
………………
奇怪的是a(1) 却没有被覆盖[/color],其他都很正常。
这是为什么?
回复列表 (共5个回复)
沙发
asymptotic [专家分:16630] 发布于 2011-11-12 20:59:00
语法规定:阁下缩写程序段是 Bug。
板凳
hint1412 [专家分:20] 发布于 2011-11-13 23:25:00
谢谢,我知道正常情况下不会这么写,只是试验一下。
您的意思就是说,第一个数据不会被覆盖掉?是什么造成的呢?
我刚接触fortran,求指点!
3 楼
asymptotic [专家分:16630] 发布于 2011-11-14 08:48:00
对 A(1 : 3) 而言,编译器有任意选择一个 Data Statement 对其初始化的权利,也就是说,是 Compiler Dependent 的。这就是 Bug 的来源之一。
4 楼
hint1412 [专家分:20] 发布于 2011-11-14 18:19:00
谢谢。
既然编译器有任意选择一个 Data Statement 对其初始化的权利,那么A(1)是1,也就是选择了第一个data statement,
那么为何A(2),A(3),A(4)都是由第二个data statement赋初值的?
5 楼
asymptotic [专家分:16630] 发布于 2011-11-15 08:15:00
A(1 : 3) 可以独立、随机地选择任何一个初始化;这样的语句对特定的 Compiler 来研究,没有任何含义,关键是要知道 Fortran 标准如何说 --- A variable, or part of a variable, shall not be explicitly initialized more than once in a program. 所以严格说起来,您的程序是 错误 的,只不过一些编译器有扩展,在 某种程度上允许您的错误,也就是有了 Bug;但你开 标准检测,就会出来 Warning。
我来回复