2

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

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

对于它的价值,所述公共块被声明为

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

block是一个 4D 数组。x, y, 和z是一维数组。llx, lly, 和llz, 是double precision类型。其余的都是integer类型。

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

4

2 回答 2

1

Some compilers do initialize common variables to zero, so if you first invoke the function with the common block, you might find zeros everywhere (although you should not rely on that). But once you set some values for the common block variables in the program, those values should appear whenever you use the common block.

As of the variables in the common block: They can be of arbitrary type, as long as they are consistently defined at all places, where the common block is used.

于 2013-02-12T14:04:29.193 回答
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
于 2014-06-24T21:32:40.323 回答