试图分配已分配的变量

时间:2015-06-28 19:32:20

标签: memory-management fortran

我遇到以下例行问题,因为我得到了 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

1 个答案:

答案 0 :(得分:2)

在执行另一个内存分配之前,应始终释放已分配的数组。当你想要分配另一个内存时,你可以事先测试一个变量是否已经分配了内存,如果是,那么首先解除分配它。

例如,我有一个可分配的变量myvar,我可以使用函数Allocated()对其进行测试,如果myvar已分配内存,则返回true,否则返回false。 / p>

ALLOCATE( myvar(10) )

IF( ALLOCATED(myvar) )  DEALLOCATE( myvar ) 

或者你也可以:

IF( .NOT. ALLOCATED( myvar ) ) ALLOCATE( myvar(10) )

其中第二种情况只有在空时才会分配内存。