尝试分配已经分配的变量

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)

Edi*_*iac 5

在执行另一次内存分配之前,您应该始终释放已分配的数组。当你想分配另一块内存时,你可以事先测试一个变量是否已经分配了内存,如果是,则先释放它。

例如,我有一个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)

其中第二种情况仅在内存为空时才分配内存。