Нужен ли мне явный интерфейс для выделения компонента производного типа в подпрограмме?

У меня есть производный тип:

module foo
  type bar
      integer, allocatable, dimension(:) :: data
  end type bar
end module foo

Теперь я хотел бы выделить данные bar внутри подпрограммы без явного интерфейса:

program main
  use foo
  type(bar) :: mybar
  call alloc_my_bar(10,mybar)
  print*, mybar
end program

subroutine alloc_my_bar(n,mybar)
  use foo
  type(bar) :: mybar
  integer :: n
  allocate(mybar%data(n))
  mybar%data = 42
end subroutine alloc_my_bar

Кажется, это прекрасно работает с ifort, но я знаю, что если бы mybar не был частью пользовательского типа, мне понадобился бы явный интерфейс... Устраняет ли размещение выделяемого массива в определяемом пользователем типе необходимость в явном интерфейс? С какой версией стандарта фортрана совместим этот код (F90, F95, F2003...), если таковой имеется?


person mgilson    schedule 21.02.2013    source источник
comment
Почему бы не поместить подпрограмму в модуль и автоматически получить интерфейс? В чем недостаток? Независимо от того, требуется ли явный интерфейс, он может помочь программисту.   -  person M. S. B.    schedule 21.02.2013
comment
@MSB - Затем вы устанавливаете порядок компиляции. С пуристской точки зрения помещение одной подпрограммы в модуль кажется хакерским. Модули, похоже, должны использоваться для группировки связанных данных/элементов. В моем случае foo уже имеет кучу связанных с ним подпрограмм. На самом деле моя программа устроена так, что модуль foo имеет тип bar и подпрограмму alloc_bar и другие подпрограммы. Затем мой код вызывает какую-то другую функцию (передавая bar), вызывает alloc_bar и затем заполняет данные. Вопрос не в том, будет ли работать alloc_bar, а в том, увидит ли изменения и основной код.   -  person mgilson    schedule 21.02.2013


Ответы (1)


Распределяемые компоненты определены в TR15581–F95, которые были включены в стандарт Fortran 2003. Для этого вам не нужен явный интерфейс, достаточно использовать ассоциацию для определения типа. Вы передаете не массив, а структуру вокруг него.

person Vladimir F    schedule 21.02.2013
comment
Спасибо за исправление, конечно, никакой ассоциации с хостом, когда ее нет в поле зрения. - person Vladimir F; 21.02.2013