是否有必要分配可分配的数组?

时间:2014-08-07 12:00:23

标签: fortran allocation

我有一个关于派生类型和已分配数组的简单问题。 假设我们已经定义了类型

type demo_type
        real(kind=8),allocatable :: a(:)
end type demo_type

和功能

function demo_fill(n) result(b)
        integer, intent(in) :: n
        real(kind=8) :: b(n)
        b = 1.d0
end function demo_fill

在主程序中写入是否正确

type(demo_type) :: DT
DT%a = demo_fill(3)

或者是否有必要首先分配DT%a以防止意外覆盖内存中的其他变量?

type(demo_type) :: DT
allocate(DT%a(3))
DT%a = demo_fill(3)

他们都编译,但我想知道哪种方法是正确的。谢谢!

1 个答案:

答案 0 :(得分:7)

在Fortran 2003中,任何可分配的数组都可以在赋值时自动分配。

在你的情况下

DT%a = demo_fill(3)

导致DT%a自动分配到右侧的形状,这是函数的结果,如果之前尚未将其分配给此形状。

此行为是标准的,但某些编译器默认情况下不启用它,特别是英特尔Fortran。您必须使用特殊的编译器标志来启用它(-standard-semantics-assume realloc_lhs

作为旁注,kind=8并不意味着所有编译器都有8字节的实数,这种用法是不受欢迎的(参见https://stackoverflow.com/a/856243/721644)。