这种共享确实是公共块的点。特别是,该语句允许在整个程序中的各个实体之间common
进行所谓的存储关联。
因此,实体X
和Y
子程序是与实体和子程序S2909
相关联的存储。一个实体中值的更改由另一个实体反映。X
Y
S2900
X
X
不过,有几件事值得注意。
在common
问题的陈述中,这依赖于所谓的空白 common。当没有为公共块指定名称时会发生这种情况,例如在语句中
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
j
我想说的最后一件事是:没有公共块的“全球”共享数据有更好的方法。