Memory management Fortran:模块中的可分配变量

Memory management Fortran:模块中的可分配变量,memory-management,module,fortran,Memory Management,Module,Fortran,我想使用数组Ar(-3:3,5),它是全局模块中的一个可分配变量,并在一个子例程中分配它,然后在下一个子例程中访问它(请参见下面的代码片段)。第二个子例程中的索引是从-3到3和从1到5,还是必须在子例程中指定 module global real, allocatable(:,:) :: Ar end module global subroutine allocateAr use global ALLOCATE(Ar(-3:3, 5)) end subroutine all

我想使用数组Ar(-3:3,5),它是全局模块中的一个可分配变量,并在一个子例程中分配它,然后在下一个子例程中访问它(请参见下面的代码片段)。第二个子例程中的索引是从-3到3和从1到5,还是必须在子例程中指定

module global
   real, allocatable(:,:) :: Ar
end module global

subroutine allocateAr
   use global

   ALLOCATE(Ar(-3:3, 5))
end subroutine allocateAr

subroutine useAr
   use global

   Ar(-3,1)=3.0  !is this -3,1 here or do I have to use 1,1????
end subroutine useAr

如果您将可分配数组作为可分配数组访问,则可分配数组始终保留其边界。这意味着甚至可以直接使用“使用关联”或“主机关联”,如您在子例程
useAR
中所示,或者如果您将它们作为可分配的伪参数传递。如果将它们作为假定形状或假定大小数组传递,则必须在每个调用的过程中指定下限,否则它将默认为1

因此,在您的情况下,可以使用
-3,1


否则,我同意Jonathan Dursi关于全局可变状态的观点。

我建议您不要使用全局变量。这只是你将面临的许多不必要的问题中的一个,如果你只是在例程之间传递变量,而不是依赖于全局可变状态,那么这些问题将基本上被忽略。如果我从头开始编写这个程序,这可能是个好主意,但是我不会改变几千行代码……你花在更新几千行代码上的时间将远远少于不必要地反复调试同样的几千行代码所花的时间;特别是如果你在eclipse中使用像photran这样的现代工具来进行重构,也许我应该学习一些编程,了解什么是photran和重构。