我的Fortran 90代码存在问题,涉及解除分配在模块中声明的数组然后分配&在子程序中初始化。在我的程序中,我在real*8, dimension(:), allocatable :: test
等模块中声明了一堆数组。然后,在初始化子例程中,我use
模块,分配变量
allocate(test(8))
,并使用test = 0.d0
进行初始化。
在此之后,我可以print*, test
并获得适当的输出:0.E+0 0.E+0 0.E+0 0.E+0 0.E+0 0.E+0 0.E+0 0.E+0
。此外,对allocated(test)
的调用会返回.TRUE.
。然而,出了点问题。在致电allocate()
后,对sizeof(test)
的调用会返回0
,并且对deallocate(test)
的调用会引发以下错误:
lib-4422 : UNRECOVERABLE library error
A DEALLOCATE statement argument points to a portion of the
original allocation.
Original size in bytes for the argument is 512
Current size in bytes for the argument is 0
Segmentation fault
这一切都发生在一个更大的代码中,在这个代码中我使用了这些数组而没有错误。当我试图在程序结束时释放内存而寻找内存泄漏时,我才注意到这个问题。我试图创建一个只执行上面描述的简单程序(即,在模块中声明,在子程序中分配和初始化,然后打印数组并在同一子程序中释放它)。但是,这个简单的代码可以正常运行并且运行时没有错误。因此,我对在大代码的上下文中导致这种行为异常的原因感到非常困惑。此外,如果在我的较大代码中,我将声明行从模块移动到子例程,一切都正常运行。
任何建议将不胜感激!提前谢谢,
〜BCL
答案 0 :(得分:0)
当处理不是单个子例程内部的数组时,我总是在声明它们而不是属性时使用 pointer
属性。在实践中,两者都将起作用。例如:
module Mod1
contains
subroutine sub1(Array)
!*** Declaration of Variables
implicit none
!*** External Variables - Arguments
real(kind=8), pointer, intent(inout) :: Array(:)
!*** Internal Variables
real(kind=8), allocatable :: InternalArr(:)
!*** Memory allocation
allocate(Array(1:8))
allocate(InternalArr(9:10))
!*** End of Subroutine
end subroutine sub1
end module Mod1
致电sub1
后,您的数组会将其维度保留在代码的任何位置。您可以根据需要随时deallocate
和allocate
。
在使用pointer
之前,我遇到了一些问题,例如您所描述的问题,有人建议我使用pointer
。从那以后,我变得非常习惯以这种方式声明数组(如果它们意味着保留在我继续使用allocatable
的相同子例程或模块上)并且它总是被证明是一种保持数组不变的好方法控制。
我真的希望这会有所帮助......这是我的第一个答案:) 编辑:我在示例代码
上纠正了一点错误