Назначение производного типа Fortran

Скажем, у меня есть производный тип от Фортрана

type :: atype
    integer :: n
    integer :: a(10)
    integer, allocatable :: b(:)
 end type

и у меня есть два экземпляра этого типа

type(atype) :: t1, t2

что именно происходит, когда я выполняю следующее задание?

t2 = t1

Меня это интересует, потому что я хотел бы правильно делать копии переменных производного типа, что означает, что скалярные компоненты должны быть равны, каждый элемент компонентов массива должен быть равным, а выделяемые массивы должны иметь одинаковый выделенный размер, а элементы должны быть равными. На данный момент я бы просто написал подпрограмму, которая правильно копирует и распределяет компоненты.

subroutine copy_atype(from, to)
    type(atype) :: from, to
    to%n = from%n
    to%a = from%a
    if (allocated(to%b)) deallocate(to%b)
    if (allocated(from%b) then
        allocate(to%b(size(from%b)))
        to%b = from%b
    end if
end subroutine

Я был бы признателен за направление к соответствующим разделам в стандартах.

Я использую gfortran 4.7.


person stiaan    schedule 01.10.2013    source источник


Ответы (2)


В случае отсутствия подходящей определенной процедуры присваивания, доступной для присвоения одного атипа другому, происходит присваивание внутреннего производного типа. Это описано в F2008 7.2.1.3. Для определения вашего типа присваивание внутреннего производного типа в основном делает то, что делает ваша процедура:

  • Неразмещаемые компоненты (которые сами по себе не имеют определенного присваивания с привязкой к типу) назначаются с использованием внутреннего присваивания. Если у них есть присваивание с привязкой к типу, оно используется.

  • Выделяемые компоненты в назначаемом объекте освобождаются, если они уже выделены, перераспределяются с тем же типом, параметрами типа и границами назначаемого выражения, а затем для передачи значения используется определенное присваивание с привязкой к типу (если применимо) или внутреннее присваивание.

Также:

  • компонентам указателя присваивается указатель;

  • Компоненты coarray должны совпадать по статусу распределения между переменной и выражением и передаются с использованием внутреннего присваивания.

person IanH    schedule 01.10.2013
comment
В исходном примере t2=t1, скажем, t1%b не выделено, а t2%b выделено. Когда вы это сделаете t2=t1, t1%b будет освобождено? Ответ немного неясен в этой ситуации. - person Alex; 28.09.2018
comment
Я думаю, вы путаете свои t1 и t2. См. Первую часть второй точки - действие по освобождению безоговорочно зависит от статуса распределения компонента в значении справа от =. Перераспределение компонента обязательно условное. - person IanH; 29.09.2018
comment
Я не знаком с указателями, реализованными / используемыми в Фортране, но я использую C / C ++. Что вы подразумеваете под указателем, назначенным в этом контексте? - person jvriesem; 20.02.2019
comment
@jvriesem Действие по присвоению указателя Fortran, то есть lhs_pointer => rhs_target. - person IanH; 21.02.2019