值未使用公共块传递给子例程
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
的公共块的第一个数字存储单元相关联。该关联不基于公共块定义中的命名或位置。
本题程序中没有其他公共块叫part
; nzcur
的子例程不与任何其他关联。它当然不与不在公共块中的变量相关联。
由于缺少关联,变量在写入语句引用它时尚未定义。再次声明,主程序中变量的定义不影响子程序中局部变量的定义。
到"correct"关联,需要将主程序的变量nzcur
放在一个名为part
的公共块中的正确位置(在主程序中).
回答"how do I set the value of nzcur
in the subroutine without using common blocks?"的问题,参考this one.
等其他问题
我正在尝试在 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
的公共块的第一个数字存储单元相关联。该关联不基于公共块定义中的命名或位置。
本题程序中没有其他公共块叫part
; nzcur
的子例程不与任何其他关联。它当然不与不在公共块中的变量相关联。
由于缺少关联,变量在写入语句引用它时尚未定义。再次声明,主程序中变量的定义不影响子程序中局部变量的定义。
到"correct"关联,需要将主程序的变量nzcur
放在一个名为part
的公共块中的正确位置(在主程序中).
回答"how do I set the value of nzcur
in the subroutine without using common blocks?"的问题,参考this one.