我有一个关于派生类型和已分配数组的简单问题。 假设我们已经定义了类型
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)
他们都编译,但我想知道哪种方法是正确的。谢谢!
答案 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)。