微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将未分配的可分配变量作为可分配的伪参数传递

如何解决将未分配的可分配变量作为可分配的伪参数传递

在以下程序中,可分配变量x被传递给子例程test_sub,而没有被分配。相应的可分配虚拟变量x_subtest_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声明来控制例程中变量的分配行为:

  1. real,allocatable,intent(inout) :: x(:)等同于您的情况。

    • 先验未知分配状态,可以使用allocated(x)进行测试;
    • 可以使用allocate / deallocate
    • 更改分配状态
  2. 如果为real,intent(in) :: x(:),则分配状态不能在其内部更改;

    • 可以使用allocated(x)
    • 测试分配状态
    • 无法修改
  3. 如果为real,intent(out) :: x(:),则变量x始终初始化为未分配,而不管其在调用例程之前的状态如何,因此您可以始终allocate(x(n))开始子程序。

我相信您正在使用选项1),但您希望使用3)。

,

这是标准行为。虚拟参数allocatable 不暗示需要在输入或输出上分配变量。这只是意味着该变量是可分配的,因此您可以将其视为该函数内部的可分配变量,例如隐式重新分配等。

,

要了解它是否是自动分配的,应在执行自己的allocate之前在子例程中打印它。没有自动分配发生。

将未分配的可分配变量传递给可分配的伪参数是完全可以的。它作为“未分配”传递。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。