【问题标题】:Value not passing to subroutine using a common block值未使用公共块传递给子程序
【发布时间】:2019-11-01 15:44:19
【问题描述】:

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

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

【问题讨论】:

  • 我正在使用普通块 Noooohhhhhhh !只是不要。查找在过去 40 年的某个时候编写的基本 Fortran 教程,并学习如何在子例程之间传递参数。您也应该在本网站的其他问题和答案中找到有用的材料。
  • 为了我们孩子的利益,请对 COMMON 块说“Nooooohhhh”。正如你所发现的,它充满了危险。如果您不想对子例程使用参数(出于某种未知原因),请使用MODULE
  • 在过去的 40 年中,也应该使用暂停。并且请显示您实际尝试的程序,或者如果它有点长,请显示一个缩减版本 - 以上不会在任何版本的 Fortran 下编译。
  • subroutine 之前应该有一个 contains,或者子程序必须在 end program 之后,否则程序根本无法编译。如果您对任何代码有疑问并在此站点上提问,请始终显示minimal reproducible example。它应该是一个可以尝试编译的实际代码。
  • 感谢您的回复,我已经删除了我的常用块,现在正在尝试使用模块。我使用的是通用块,因为这是我使用的书所建议的。我现在收到以下错误:` 错误 #7002:打开编译的模块文件时出错。检查包含路径。 [变量] ` 代码是:module variables real(8) nzcur save end module variables program main use variables nzcur=1 call hit end program main contains subroutine hit use variables write(*,*)nzcur end

标签: fortran fortran-common-block


【解决方案1】:

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

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

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

在子程序中

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的值?”的问题,请参考this one等其他问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-09
    • 2015-11-29
    • 2017-04-17
    • 2023-03-23
    • 2021-04-03
    • 2011-12-09
    • 2021-03-29
    相关资源
    最近更新 更多