Независимое от типа перераспределение памяти в fortran

Я пытаюсь создать подпрограмму для перераспределения памяти для не зависящего от типа выделяемого массива, например:

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? Как бы это сделать?


person jip    schedule 19.06.2016    source источник
comment
stackoverflow.com/q/27165854/577108 может помочь в этом вопросе.   -  person haraldkl    schedule 19.06.2016


Ответы (1)


Невозможно написать такую ​​процедуру перераспределения, не зависящую от типа, в Fortran 2003 или Fortran 2008.

Возможны следующие варианты:

  • подтолкнуть операторы выделения, которые выполняют (пере) выделение, обратно в область, где известен тип, эффективно повторяя код для каждого перераспределения;

  • явно переписать процедуру перераспределения для каждого типа интереса; или

  • один раз напишите исходный код для общего перераспределения, но затем используйте уловки INCLUDE или аналогичные для явного создания экземпляра процедуры для каждого интересующего типа.

CLASS (*) обычно не подходит в качестве универсального средства программирования. Даже если бы можно было написать тело этой процедуры, ее невозможно вызвать с пользой.

(Обратите внимание, что приведенный пример кода ссылается на неопределенные и потенциально нераспределенные переменные.)

person IanH    schedule 20.06.2016
comment
На самом деле, невозможность вызвать подпрограмму с аргументами общего класса (*) была тем, о чем я не знал. Фактически, наконец, я решил проблему, просто перегрузив процедуру для всех типов данных, которые могут быть перераспределены. - person jip; 20.06.2016