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

时间:2019-06-19 00:17:52

标签: fortran fortran-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

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

1 个答案:

答案 0 :(得分:0)

如评论中所述,对该问题的正确学习答案是避免使用公共块来访问其他作用域的变量。在现代时代编写代码时,有更好的方法(稍后介绍)。

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

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

在子例程中

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

我们有一个名为part的命名公共块,其中一个数字存储单元包含整数变量nzcur(由于隐式键入)。

在该问题中,显然期望该公共块中的变量nzcur访问某个名为nzcur的其他变量,而该另一个变量是主程序中名为{{1}的那个变量}。这是不正确的。

子例程中的

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

在问题程序中,没有其他称为part的公共块;子例程的part与其他任何事物都没有关联。当然,它与不在公共块中的变量没有关联。

由于缺少关联,因此在write语句引用该变量时未定义该变量。同样,主程序中变量的定义不会影响子例程中局部变量的定义。

要“更正”关联,必须将主程序的变量nzcur放在正确的位置(位于主程序中)nzcur的公共块中。


要回答“如何在不使用公共块的情况下在子例程中设置part的值?”的问题,请参考其他问题,例如this one