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