当您对派生类型变量进行内部赋值时,将使用指针赋值来复制任何指针=>
(它只是复制现有内存块的地址和其他属性)。您必须确保在内存中分配新的目标并将数组的值复制到那里。
您可以为给定类型创建自己的重载赋值,然后使用语法var1 = var1
,或者如果足够的话,您可以将正确的赋值编码到您的子例程中:
subroutine init(var,var1) !This of course will not work
type(variable) :: var, var1 !DO NOT FORGET THIS WHEN POSTING EXAMPLES NEXT TIME!
allocate( var1%p(lbound(var%p,1):ubound(var%p,1)) )
var1%p = var%p
end subroutine
正如 High Performance Mark 评论的那样,如果您没有其他原因使用指针,那么可分配组件要好得多。
type variable
real, dimension(:), allocatable :: p
end type variable
subroutine init(var,var1) !This WILL work
type (variable):: var, var1
var1 = var
end subroutine
在您的编辑中,您遇到了同样的问题:
var1 = var
这和以前的问题一模一样,你没有改变任何东西!
Also
allocate(var1, source=var)
应该与原始代码具有相同的效果,我相信你需要
allocate(var1%p, source=var%p)
但我已经评论过,大多数常见版本的 gfortran 不会接受这一点,并且需要明确指定形状。
变量var
and var1
不必是可分配的。但如果出于其他原因需要的话,它们也可以。
可以编写一次用户定义的赋值,然后重载内部赋值(=
).
type variable
real :: pointer :: p(:)
contains
procedure :: assign
generic :: assignment(=) => assign
end type
subroutine assign(out, in)
class(variable), intent(out) :: out
class(variable), intent(in) :: in
allocate( out%p(lbound(in%p,1):ubound(in%p,1)) )
out%p = in%p
end subroutine
然后你可以写var1 = var
每当你需要它就会调用子程序assign
自动地。