fortran中与类型无关的内存重新分配

时间:2016-06-19 10:34:20

标签: memory-management fortran gfortran fortran2003

我尝试构建一个子例程来为类型无关的可分配数组重新分配内存,如下所示:

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标准中的意图是什么?这样做的方法是什么?

1 个答案:

答案 0 :(得分:0)

在Fortran 2003或Fortran 2008中无法编写这种类型不可知的重新分配过程。

您的选择是:

  • 推送执行(重新)分配的allocate语句,备份到已知类型的范围内,有效地重复每次重新分配的代码;

  • 明确重写每种兴趣类型的重新分配程序;或

  • 一般性地编写重新分配的源代码,但是然后使用INCLUDE技巧或类似方法为每种感兴趣的类型显式实例化过程。

CLASS(*)通常不适合作为通用编程工具。即使有可能写出该程序的主体,也不可能有用地打电话。

(请注意,显示的示例代码引用了未定义的和可能未分配的变量。)