Cha*_*les 3 fortran memory-management
我在执行以下例程时遇到问题,因为我收到 Fortran 运行时错误:Attempting to allocate already allocated variable 'sb'。这个函数对我来说似乎不错,但显然编译器不喜欢它。什么时候会发生 allocate 被调用两次的情况?
当我在程序中第二次调用该函数时,出现问题。
这是我的电话
sb = srepl (sa, "s/duda/duda:/g")
sc = srepl (sb, "s/ //g")
Run Code Online (Sandbox Code Playgroud)
这就是功能
Function srepl (sa, test, psutl) Result (sb)
Character (Len=:), Allocatable :: sb
Character (Len=*), Intent (In) :: sa
Character (Len=*), Intent (In), Optional :: test
Integer :: k
Character (Len=65) :: s, a, b, c, d
If (Present (psutl)) Then
Allocate (Character (Len=Len_trim(sa)) :: sb)
Return
End If
If (get (k) /= 3) Then
Allocate (Character (Len=Len_trim(sa)) :: sb)
sb = Trim (sa)
Return
End If
If (valid (test, a)) Then
s = Trim (a)
Else If (project (test, b)) Then
s = Trim (b)
Else
If (project (sa, c, d) Then
s = Trim (c)
Else
s = Trim (d)
End If
End If
Allocate (Character (Len=Len_trim(s)) :: sb)
sb = Trim (s)
End Function srepl
Run Code Online (Sandbox Code Playgroud)
在执行另一次内存分配之前,您应该始终释放已分配的数组。当你想分配另一块内存时,你可以事先测试一个变量是否已经分配了内存,如果是,则先释放它。
例如,我有一个myvar可分配的变量,我可以使用函数测试它Allocated(),如果myvar已分配内存,该函数将返回 true,否则返回 false。
ALLOCATE( myvar(10) )
IF( ALLOCATED(myvar) ) DEALLOCATE( myvar )
Run Code Online (Sandbox Code Playgroud)
或者你也可以:
IF( .NOT. ALLOCATED( myvar ) ) ALLOCATE( myvar(10) )
Run Code Online (Sandbox Code Playgroud)
其中第二种情况仅在内存为空时才分配内存。