«начальный» оператор / автоматический конструктор для производного типа на Фортране - PullRequest
0 голосов
/ 05 октября 2018

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

Схематический пример полноты:

module mod
integer :: n=5

type array
    real, dimension(:), allocatable :: val
  contains
    procedure :: array()
end type 

subroutine array(this)
  allocate(this%val(n))
end subroutine

end module

Теперь, когда я создаю экземпляр type(array) :: instance I 'Мне бы хотелось, чтобы конструктор array(instance) вызывался автоматически без каких-либо дополнительных call array(instance) в коде, добавленном вручную.

Я нашел многообещающую информацию на этом сайте, но больше нигде: он указываетконструктороподобный механизм с объявленной процедурой привязки типа initial,pass :: classname_ctor0.Какой стандарт это?ifort в версии 16 не будет компилировать размещенный там пример, и у меня нет доступных стандартов.

1 Ответ

0 голосов
/ 05 октября 2018

Подпрограмма 'initial' не является, в отличие от заключительной подпрограммы, частью стандарта Fortran.

В производном типе некоторые компоненты могут иметь начальные значения, установленные инициализация по умолчанию ,например,

type t
  integer :: i=5
end type t
type(t) :: x  ! x%i has value 5 at this point

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

В случае вопроса следует рассмотреть один параметризованный тип Fortran 2003+:

type t(n)
  integer, len :: n
  integer val(n)
end type
type(t(5)) :: x  ! x%val is an array of shape [5]

Естественно, это не то же самое, что компонент размещаемого массива с «начальной» формой, но если вы просто хотите, чтобы компонент был начальной настраиваемой формой во время выполнения, этого может быть достаточно.

...