创建子程序以在主程序中释放数组

时间:2017-04-29 19:07:19

标签: memory-management fortran allocation

我有一个Fortran主程序,其中包含许多已分配的数组。我创建了一个子程序来分配主程序调用的这些数组。我想为deallocates做一个类似的事情,但我收到一个编译错误,说他们没有定义为可分配。我最初编写的代码如下:

SUBROUTINE deallocate_jacobian(int3, int4, int5, Diag, Off_Diag_LR, Off_Diag_RL)
use Globals_module,   only : alloc_stat
!--------------------------------------------end of use--------------------------------------------!
integer(i4), intent(in) :: int3, int4, int5
real(dp), intent(inout) ::  Diag(int3, int3, int4),  off_diag_lr(int3, int3, int5), off_diag_rl(int3, int3, int5)
!------------------------------------------end of intents------------------------------------------!
deallocate(Diag,        STAT = alloc_stat)
deallocate(Off_Diag_LR, STAT = alloc_stat)
deallocate(Off_Diag_RL, STAT = alloc_stat)
END SUBROUTINE deallocate_jacobian

然后我重写了它:

SUBROUTINE deallocate_jacobian(int3, int4, int5, Diag, Off_Diag_LR, Off_Diag_RL)
use Globals_module,   only : alloc_stat
!--------------------------------------------end of use--------------------------------------------!
integer(i4), intent(in) :: int3, int4, int5
real(dp), allocatable, intent(out) :: Diag(:,:,:),  off_diag_lr(:,:,:), off_diag_rl(:,:,:)
!------------------------------------------end of intents------------------------------------------!
deallocate(Diag,        STAT = alloc_stat)
deallocate(Off_Diag_LR, STAT = alloc_stat)
deallocate(Off_Diag_RL, STAT = alloc_stat)
END SUBROUTINE deallocate_jacobian

编译器错误消失了,但是我想知道我是否错过了可分配意图的更大问题,不在内容。

2 个答案:

答案 0 :(得分:4)

首先要提醒读者,过程的伪参数与过程参考中的实际参数之间存在区别。特别是,虚拟参数通常不会出现,#34;知道"关于实际论证的事情,而不是它对自己的了解。

那就是Diag在第一次尝试中无法分配但在第二次尝试中的原因。

现在,问题是关于可分配伪参数的更广泛方面。 中有很多问题涉及这个问题的部分内容,因此我只是总结那些具有共同意义的问题,并让有兴趣的各方进一步研究。

  1. 要考虑伪参数的分配状态,它必须是可分配的。
  2. 要与可分配的伪参数关联,实际参数必须是可分配的。
  3. 当两者都是可分配的时,实际和伪参数的等级必须匹配。
  4. 当两者都是可分配的时,输入实参数和伪参数的参数必须匹配,这些参数必须是延迟的。
  5. 如果可分配的伪参数具有intent(out),则在调用过程时释放实际参数,并且伪参数在过程中开始生效,因为未分配。
  6. 如果可分配的伪参数具有intent(in),则无法在过程中更改其分配状态。
  7. 如果可分配的伪参数不具有intent(out),则它具有与实际参数相同的边界/范围(而不是通常的1索引默认下限)。

答案 1 :(得分:3)

我会更明确地说出来。您应该始终检查alloc_stat或根本不使用它!

您将看到在第二个片段中,所有解除分配实际上都失败了。原因可能令你感到困惑。原因是他们已经解除分配

原因是intent(out)导致可分配参数的自动释放。