如何解决将未分配的可分配变量作为可分配的伪参数传递
在以下程序中,可分配变量x
被传递给子例程test_sub
,而没有被分配。相应的可分配虚拟变量x_sub
在test_sub
中分配:
module test_mod
implicit none
contains
subroutine test_sub(x_sub)
implicit none
real,allocatable :: x_sub(:)
! Execution !
! return
allocate(x_sub(1))
! deallocate(x_sub)
end subroutine test_sub
end module test_mod
program test
use test_mod,only: test_sub
implicit none
real,allocatable :: x(:)
! Execution !
print*,'Before call to sub',allocated(x)
call test_sub(x)
print*,'After call to sub',allocated(x)
end program test
当控制权返回主程序时,将分配x
:
Before call to sub F
After call to sub T
如果test_sub
在分配x_sub
之前返回,或者x_sub
在返回之前被释放,则x
未被分配:
Before call to sub F
After call to sub F
我同时使用gfortran 4.4.7和ifort 19.0观察到了这种行为。
我的问题是这是否是标准行为。我希望在尝试传递x
而不分配它时会遇到段错误。我担心这种行为可能会在大型程序中导致意外结果。
解决方法
您可以使用intent
声明来控制例程中变量的分配行为:
-
real,allocatable,intent(inout) :: x(:)
等同于您的情况。- 先验未知分配状态,可以使用
allocated(x)
进行测试; - 可以使用
allocate
/deallocate
更改分配状态
- 先验未知分配状态,可以使用
-
如果为
real,intent(in) :: x(:)
,则分配状态不能在其内部更改;- 可以使用
allocated(x)
测试分配状态
- 无法修改
- 可以使用
-
如果为
real,intent(out) :: x(:)
,则变量x始终初始化为未分配,而不管其在调用例程之前的状态如何,因此您可以始终以allocate(x(n))
开始子程序。
我相信您正在使用选项1),但您希望使用3)。
,这是标准行为。虚拟参数allocatable
不暗示需要在输入或输出上分配变量。这只是意味着该变量是可分配的,因此您可以将其视为该函数内部的可分配变量,例如隐式重新分配等。
要了解它是否是自动分配的,应在执行自己的allocate
之前在子例程中打印它。没有自动分配发生。
将未分配的可分配变量传递给可分配的伪参数是完全可以的。它作为“未分配”传递。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。