Fortran 我是否需要显式接口来在子例程中分配派生类型的组件?

Fortran 我是否需要显式接口来在子例程中分配派生类型的组件?,fortran,derived-types,allocatable-array,Fortran,Derived Types,Allocatable Array,我有一个派生类型: 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 subrouti

我有一个派生类型:

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不是用户定义类型的一部分,那么我需要一个显式接口。。。将可分配数组放入用户定义的类型中是否就不需要显式接口?此代码与什么版本的fortran标准兼容(F90、F95、F2003…),如果有的话?

可分配组件在并入fortran 2003标准的TR15581至F95中定义。您不需要显式接口,只需要类型定义的使用关联就可以了。您传递的不是数组,而是数组周围的结构。

为什么不将子例程放在模块中并自动获得接口?缺点是什么?无论是否需要显式接口,它都可以帮助程序员。@M.S.B-然后您强制执行编译顺序。从纯粹主义者的角度来看,在模块中放置一个子例程似乎有点不妥。模块似乎应该用于对相关数据/项目进行分组。在我的例子中,
foo
已经有一系列与之相关的子例程。实际上,我的程序的结构使得模块
foo
具有类型
bar
和子例程
alloc\u bar
和其他子模块。然后我的代码调用一些其他函数(传入一个
bar
),调用
alloc\u bar
,然后填充数据。问题不在于
alloc\u bar
是否有效,而在于主代码是否也会看到更改。感谢您的更正,当然,当看不到包含时,主机不会关联。