Я пытаюсь создать подпрограмму для перераспределения памяти для не зависящего от типа выделяемого массива, например:
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
Например, предположим, что у меня есть тип (type1), allocatable :: v, выделенный в пределах индексов -1 и 4, и я вызываю reallocate (v, 6). После этого я хочу, чтобы v было распределено между -1 и 6.
Итак, проблема возникает, когда вектор уже выделен, и я хочу сохранить информацию, уже сохраненную в векторе, скопировав ее во вновь перераспределенный временной массив (строка, которая читает tmp (lbound (vector, 1): ubound (vector, 1) )) = вектор). gfortran жалуется: «Ошибка: переменная, не подлежащая размещению, не должна быть полиморфной во внутреннем присваивании в (1) - проверьте, существует ли соответствующая конкретная подпрограмма для оператора '='».
Разрешено ли то, что я намереваюсь сделать, в стандарте Fortran 2003? Как бы это сделать?