Fortran 为什么公共块变量不能保留其值?

Fortran 为什么公共块变量不能保留其值?,fortran,fortran-common-block,Fortran,Fortran Common Block,首先,我知道在fortran(和一般编程)中使用公共块是个坏主意。但是,我正在更新其他人的代码,我不想把已知的工作搞砸。 第二,我知道我应该发布一些比这更具体的东西。如果我知道如何把它缩小,我会的。但是,因为我知道,而且我认为您不会欣赏2500行代码,所以我无法发布具体示例。 考虑到这一点,我无法描述我的问题 我正在更新别人的fortran代码。这个家伙使用了几个(4)公共块来设置全局变量。出于某种原因,当我调用使用这样一个块的函数时,它的值都是0。以前有人遇到过吗?有人知道为什么会这样吗?如何

首先,我知道在fortran(和一般编程)中使用公共块是个坏主意。但是,我正在更新其他人的代码,我不想把已知的工作搞砸。
第二,我知道我应该发布一些比这更具体的东西。如果我知道如何把它缩小,我会的。但是,因为我知道,而且我认为您不会欣赏2500行代码,所以我无法发布具体示例。
考虑到这一点,我无法描述我的问题

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

无论如何,所述公共块被声明为

common /set/ block,x,y,z,llx,lly,llz,ilx,ily,ilz,third,third2
是一个4D阵列
x
y
z
是一维数组
llx
lly
llz
双精度
类型。其余的是
integer
类型


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

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


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

您能将您的代码与这个小示例进行比较吗?我认为您可能遗漏了一些东西,比如子例程中的“common”声明

注意子例程(
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

即使之前设置为其他值,它们也为零?在公共块的所有实例中,声明的维度是否相等?能否将公共块升级为模块?唯一的区别是在当前使用公共块的地方使用模块。主要的优点是您只需要在一个地方声明变量,顺序并不重要。@sigma我可以,但这需要小心。如果可以的话,我宁愿避免这种情况。@VladimirF是的,是的。我测试的变量是llxi,如果你有公共块,你也有等价的东西吗?OP声称问题在于保留值,而不是初始化。否则,BSS段将在ELF可执行文件中自动归零,而与编译器无关。