我尝试构建一个子例程来为类型无关的可分配数组重新分配内存,如下所示:
subroutine reallocate(vector, num)
implicit none
class(*), dimension(:), allocatable, intent(inout) :: vector
integer :: num
class(*), dimension(:), allocatable :: tmp
integer :: lb, ub, ii_
if (allocated(vector)) then
ub = max(ubound(vector, 1), ub)
lb = min(lbound(vector, 1), lb)
if (ub .GT. ubound(vector, 1) .OR. lb .LT. lbound(vector, 1)) then
allocate(tmp(ub:lb), source=vector)
tmp(lbound(vector,1):ubound(vector,1)) = vector
call move_alloc(tmp, vector)
else
return
end if
else
allocate(vector(num:num), source=vector)
return
end if
return
end subroutine
例如,假设我在索引-1和4中分配了一个类型(type1),allocatable :: v,我调用reallocate(v,6)。之后我想要在-1和6之间分配v。
所以,问题来自于已经分配了向量,并且我想通过将信息复制到新重新分配的时间数组(读取tmp(lbound(vector,1):ubound的行)来保存已经存储在向量中的信息vector,1))= vector)。 gfortran抱怨:“错误:在(1)的内部赋值中,不可分配的变量不能是多态的 - 检查”=“运算符是否存在匹配的特定子例程。”
我在Fortran 2003标准中的意图是什么?这样做的方法是什么?
答案 0 :(得分:0)
在Fortran 2003或Fortran 2008中无法编写这种类型不可知的重新分配过程。
您的选择是:
推送执行(重新)分配的allocate语句,备份到已知类型的范围内,有效地重复每次重新分配的代码;
明确重写每种兴趣类型的重新分配程序;或
一般性地编写重新分配的源代码,但是然后使用INCLUDE技巧或类似方法为每种感兴趣的类型显式实例化过程。
CLASS(*)通常不适合作为通用编程工具。即使有可能写出该程序的主体,也不可能有用地打电话。
(请注意,显示的示例代码引用了未定义的和可能未分配的变量。)