正如评论中所指出的,对这个问题的正确学习反应是避免使用公共块来访问来自其他范围的变量。在现代编写代码时,有更好的方法(稍后会更多)。
然而幸运的是,我们可以从“我如何理解这个公共块发生了什么?”的角度来看待这个问题。这样的问题对于那些试图理解旧(或写得不好的新)代码的不幸程序员很有用。
在考虑问题的程序时,应该注意需要进行一些更正才能获得可编译的代码(使用不同的可能方法)。那里的错误与讨论没有直接关系。
在子程序中
subroutine hit
common/part/nzcur
write(*,*)"nzcur in hit",nzcur; pause
end
我们有一个名为的公共块part
,有一个包含整数变量的数字存储单元nzcur
(感谢隐式类型)。
在这个问题中,显然期望nzcur
这个公共块中的变量访问其他一些名为的变量nzcur
,并且这个其他变量是主程序中的那个变量nzcur
。这是不正确的。
nzcur
子例程中的 . 仅与任何其他名为 的公共块的第一个数字存储单元相关联part
。该关联不是基于公共块定义中的命名或位置。
在问题的程序中,没有其他公共块称为part
; nzcur
的子程序不与其他任何东西相关联。它当然不与不在公共块中的变量相关联。
由于缺乏关联,变量在 write 语句引用它时没有定义。同样,主程序中变量的定义不影响子程序中局部变量的定义。
为了“纠正”关联,有必要将主程序的变量放在nzcur
名为part
(在主程序中)的公共块中的正确位置。
要回答“如何nzcur
在不使用公共块的情况下在子程序中设置 的值?”的问题,请参阅其他问题,例如这个。