【问题标题】:Why would common block variables not preserve their values?为什么常见的块变量不会保留它们的值?
【发布时间】:2013-01-27 17:45:15
【问题描述】:

首先,我知道在 fortran(和一般编程)中使用公共块是一个坏主意。但是,我正在更新其他人的代码,我不想弄乱已知有效的东西。
其次,我知道我应该发布一些更具体的内容。如果我知道如何将其减少为小东西,我会的。但是,由于我知道,而且我认为您不会欣赏 2500 行代码,因此我无法发布具体示例。
考虑到这一点,我无法描述我的问题。

我正在更新别人的 fortran 代码。这家伙使用了几 (4) 个通用块来设置全局变量。出于某种原因,当我调用使用这样一个块的函数时,它的所有值都是 0。以前有人遇到过吗?有谁知道为什么会发生这种情况?如何重现这个?检查这一点的任何起点都会有所帮助。

为了它的价值,所说的公共块被声明为

common /set/ block,x,y,z,llx,lly,llz,ilx,ily,ilz,third,third2

block 是一个 4D 数组。 xyz 是一维数组。 llxllyllzdouble precision 类型。其余为integer 类型。

在调用任何函数之前,在主程序中声明和初始化公共块。

【问题讨论】:

  • 即使您之前设置了它们也为零?公共块的所有实例中声明的尺寸是否相等?
  • 不能把通用块升级成模块吗?唯一的区别是use 模块在当前使用公共块的地方。主要优点是您只需在一处声明变量,顺序无关紧要。
  • @sigma 我可以,但这需要谨慎。如果可以的话,我宁愿避免这种情况。
  • @VladimirF 是的,是的。我测试的变量是 llx
  • 如果你有 COMMON 块,你也有任何 EQUIVALENCEing 吗?

标签: fortran fortran-common-block


【解决方案1】:

一些编译器确实会将公共变量初始化为零,因此如果您首先使用公共块调用该函数,您可能会发现到处都是零(尽管您应该依赖它)。但是一旦你在程序中为公共块变量设置了一些值,这些值应该会在你使用公共块时出现。

关于公共块中的变量:它们可以是任意类型,只要它们在所有使用公共块的地方都一致地定义。

【讨论】:

  • OP 声称问题在于保留值,而不是初始化。否则,无论编译器如何,ELF 可执行文件中的 BSS 段都会自动归零。
【解决方案2】:

您能否将您的代码与这个小示例进行比较?我认为您可能遗漏了某些内容,例如子例程中的“通用”声明。

注意,您不需要在子例程 (AA) 中为变量使用与 main (GB) 相同的名称。只是公共块名称 (myarray) 必须相同。但是,如果您将AA 替换为GB,则不会发生任何不好的事情,并且最终结果会更清晰一些。

program main
    real             GB(4)
    common /myarray/ GB

    integer  i
    real     B(4)

    GB=0
    write(*,*) 'GB',GB

    do i=1,4
        call AddSubR()
        write(*,*) 'GB',GB
    enddo

end program main

subroutine AddSubR()
    real             AA(4)
    common /myarray/ AA

    integer i

    do i=1,4
        AA(i) = AA(i)+1
    enddo

end subroutine AddSubR

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-25
    • 2021-08-23
    • 2019-07-07
    • 2013-06-25
    • 1970-01-01
    相关资源
    最近更新 更多