我遇到以下例行问题,因为我得到了
Fortran运行时错误:Attempting to allocate already allocated variable 'sb'
。这个函数对我来说似乎很好,但显然编译器并不喜欢它。何时可以发生分配被调用两次?
当我在程序中第二次调用该函数时会出现问题。
这是我的电话
sb = srepl (sa, "s/duda/duda:/g")
sc = srepl (sb, "s/ //g")
这就是功能
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
答案 0 :(得分:2)
在执行另一个内存分配之前,应始终释放已分配的数组。当你想要分配另一个内存时,你可以事先测试一个变量是否已经分配了内存,如果是,那么首先解除分配它。
例如,我有一个可分配的变量myvar
,我可以使用函数Allocated()
对其进行测试,如果myvar
已分配内存,则返回true,否则返回false。 / p>
ALLOCATE( myvar(10) )
IF( ALLOCATED(myvar) ) DEALLOCATE( myvar )
或者你也可以:
IF( .NOT. ALLOCATED( myvar ) ) ALLOCATE( myvar(10) )
其中第二种情况只有在空时才会分配内存。