假设我有两个子程序
SUBROUTINE S2909
COMMON X,Y
X =2;
Y =3;
END
SUBROUTINE S2900
COMMON X,Y
//display X and Y
END
COMMON块用于共享变量,这是否意味着子例程X
中更新的Y
,S2909
的值与子例程{{1}中的值相同}}?
答案 0 :(得分:1)
根据我的理解,是的,变量在整个程序中共享。它们的值取决于子程序的调用顺序。
以下计划
program test
real x,y
common x,y
x = 1
y = 2
write(*,*) x,y
call changevals
write(*,*) x,y
end program test
subroutine changevals
real x,y
common x,y
x = 12
y = 13
end subroutine changevals
输出
1.00000 2.00000
12.00000 13.00000
答案 1 :(得分:1)
这种共享确实是常见块的重点。特别是,common
语句允许整个程序中各种实体之间的所谓存储关联。
因此,子例程X
中的实体Y
和S2909
是与子例程{{1}中的实体X
和Y
相关联的存储}。对一个实体S2900
中的值的更改将由另一个实体X
反映。
但是有一些值得注意的事情。
在问题的X
语句中,这依赖于所谓的空白常用。当没有为公共块指定名称时会发生这种情况,例如在语句
common
这是值得注意的,因为尝试将此问题中的行为概括为named common blocks may be troublesome。
引用公共块的各个位置中的实体不是按名称关联,而是按存储顺序中的顺序关联。这意味着必须谨慎使用
common /named/ x, y
但我的回答确实有两点要做,而上面只是一个序言,使其更像答案。
首先,我会提到一个我不希望在野外看到的病态病例。
问题在于依赖隐式输入。请考虑以下
SUBROUTINE S2909
COMMON X,Y
END
SUBROUTINE S2900
COMMON Y,X
END
这是一个不文明代码编写的例子,但它说明了一件重要的事情。由于子例程subroutine S2909
common x, y
x = 2.
y = 3.
end subroutine S2909
implicit integer (a-z)
call S2909
call S2900
contains
subroutine S2900
common x, y
print*, x, y
end subroutine
end
中的x
和S2909
中的实体x
具有不同的类型,因此定义其中一个实体会导致另一个未定义。即:更新一个值不会更新另一个的值。使用显式类型,可以看到相同的内容,或者是否存在使用默认规则和实体S2900
和i
的隐式类型,例如,在一个子例程中。
我想说的最后一件事是:much better ways of sharing data "globally" without common blocks。