值未使用公共块传递给子例程

Value not passing to subroutine using a common block

我正在尝试在 Fortran 主程序和子例程之间传递参数。但是由于某种原因,在子例程中获得了不同的值。我正在使用普通块。

program main
nzcur=1
write(*.*)"nzcur in main",nzcur

call hit

subroutine hit
common/part/nzcur
write(*,*)"nzcur in hit",nzcur; pause
end

end program

我希望 nzcur=1 但我得到 nzcur=0

我认为这可能是数据类型不匹配,因为我没有定义它,只是作为一个公共块。

如评论中所述,对此问题的正确学习回答是避免使用公共块访问其他范围的变量。在现代写代码有更好的方法(稍后更多)。

不过幸运的是,我们可以从"how do I understand what is happening with this common block?"的角度来看这个问题。这样的问题对那些试图理解旧代码(或写得不好的新代码)的不幸程序员很有用。

在考虑问题的程序时,应该注意需要进行多次更正才能获得可编译的代码(使用不同的可能方法)。那里的错误与讨论没有直接关系。

子程序中

subroutine hit
common/part/nzcur
write(*,*)"nzcur in hit",nzcur; pause
end

我们有一个名为 part 的命名公共块,它有一个包含整数变量 nzcur 的数字存储单元(多亏了隐式类型)。

在这个问题中,显然期望这个公共块中的变量 nzcur 访问另一个名为 nzcur 的变量,并且这个另一个变量是主程序中名为 nzcur。这是不正确的。

子程序中的

nzcur 仅与任何其他名为 part 的公共块的第一个数字存储单元相关联。该关联不基于公共块定义中的命名或位置。

本题程序中没有其他公共块叫partnzcur 的子例程不与任何其他关联。它当然不与不在公共块中的变量相关联。

由于缺少关联,变量在写入语句引用它时尚未定义。再次声明,主程序中变量的定义不影响子程序中局部变量的定义。

到"correct"关联,需要将主程序的变量nzcur放在一个名为part的公共块中的正确位置(在主程序中).


回答"how do I set the value of nzcur in the subroutine without using common blocks?"的问题,参考this one.

等其他问题