2016-06-19 3 views
1

Я пытаюсь построить подпрограмму перераспределить память для типа независимого размещаемого массива как это: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? Каким был бы способ сделать это?

+0

http://stackoverflow.com/q/27165854/577108 может быть полезным на этот вопрос. – haraldkl

ответ

0

Там нет никакого способа, чтобы написать такой агностик процедуру перераспределения типа в Fortran 2003 или Fortran 2008

варианты:

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

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

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

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

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

+0

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