2

我正在尝试在 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

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

4

1 回答 1

0

正如评论中所指出的,对这个问题的正确学习反应是避免使用公共块来访问来自其他范围的变量。在现代编写代码时,有更好的方法(稍后会更多)。

然而幸运的是,我们可以从“我如何理解这个公共块发生了什么?”的角度来看待这个问题。这样的问题对于那些试图理解旧(或写得不好的新)代码的不幸程序员很有用。

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

在子程序中

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在不使用公共块的情况下在子程序中设置 的值?”的问题,请参阅其他问题,例如这个

于 2019-06-19T09:20:58.430 回答