首先,我知道在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
类型。
在调用任何函数之前,在主程序中声明并初始化公共块。
答案 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