为什么常见的块变量不能保留它们的值?

时间:2013-02-12 12:07:08

标签: fortran fortran-common-block

首先,我知道在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类型。

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

2 个答案:

答案 0 :(得分:1)

有些编译器会将公共变量初始化为零,因此如果您首先使用公共块调用该函数,则可能会在任何地方找到零(尽管您应该依赖于此)。但是,一旦为程序中的公共块变量设置了一些值,只要使用公共块,就会出现这些值。

从公共块中的变量开始:它们可以是任意类型,只要它们在使用公共块的所有位置一致地定义。

答案 1 :(得分:0)

你可以将你的代码与这个小例子进行比较吗?我想你可能会遗漏一些东西,比如"普通"子程序中的声明。

注意您不需要为子程序(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