我有一个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
编译器错误消失了,但是我想知道我是否错过了可分配意图的更大问题,不在内容。
答案 0 :(得分:4)
首先要提醒读者,过程的伪参数与过程参考中的实际参数之间存在区别。特别是,虚拟参数通常不会出现,#34;知道"关于实际论证的事情,而不是它对自己的了解。
那就是Diag
在第一次尝试中无法分配但在第二次尝试中的原因。
现在,问题是关于可分配伪参数的更广泛方面。 fortran中有很多问题涉及这个问题的部分内容,因此我只是总结那些具有共同意义的问题,并让有兴趣的各方进一步研究。
intent(out)
,则在调用过程时释放实际参数,并且伪参数在过程中开始生效,因为未分配。intent(in)
,则无法在过程中更改其分配状态。intent(out)
,则它具有与实际参数相同的边界/范围(而不是通常的1索引默认下限)。答案 1 :(得分:3)
我会更明确地说出来。您应该始终检查alloc_stat
或根本不使用它!
您将看到在第二个片段中,所有解除分配实际上都失败了。原因可能令你感到困惑。原因是他们已经解除分配。
原因是intent(out)
导致可分配参数的自动释放。