gpt4 book ai didi

memory-management - 将未分配的可分配变量作为可分配的虚拟参数传递

转载 作者:行者123 更新时间:2023-12-01 23:42:37 24 4
gpt4 key购买 nike

在下面的程序中,一个可分配的变量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 声明来控制例程中变量的分配行为:

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

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

    • 可以使用allocated(x)测试分配状态
    • 不能修改
  3. 如果 real, allocatable, intent(out)::x(:),那么变量 x 总是初始化为未分配,不管它是什么调用例程之前的状态,因此您可以始终allocate(x(n)) 开始您的子例程。

我相信您使用的是选项 1),但您想要选项 3)。

关于memory-management - 将未分配的可分配变量作为可分配的虚拟参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64783329/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com