以种类参数作为子例程参数的参数化派生类型

时间:2018-07-02 08:23:41

标签: fortran derived-types fortran2003

说我们有以下代码:

module foo
use :: iso_fortran_env
implicit none

type :: bar (p, q)
    integer, kind :: p
    integer, len  :: q
    integer(kind = p), dimension(q) :: x
end type bar

contains

subroutine barsub (this)
    class(bar(*,*)), intent(in) :: this
    write (*,*) this%x
end subroutine barsub

end module foo

此代码无法与gfortran 8或pgfort 18.4一起编译。 pgi编译器说

  

非法选择器-KIND值必须为非负数   假定类型参数(*)不能与非长度类型参数p

一起使用

gfortran产生

  

(1)处的KIND参数'p'不能为ASSUMED或DEFERRED

如果我将上面的代码更改为

subroutine barsub (this)
    class(bar(INT32,*)), intent(in) :: this
    write (*,*) this%x
end subroutine barsub

两个编译器都可以正常编译。

是否可以在不需要显式指定kind参数的情况下编写子例程?在上面的示例中,INT32INT64,...的代码是相同的,并且我不想为kind参数的每个可想象的值复制粘贴它。对于len参数,它工作正常。为什么我不能对kind参数做同样的事情?

1 个答案:

答案 0 :(得分:3)

  

是否可以在不需要显式指定kind参数的情况下编写子例程?

否,kind类型的参数需要由常量表达式指定或默认设置,请参见例如Fortran 2008标准,定义1.3.147.12.3。

  

为什么不能对kind参数做同样的事情?

lenkind类型参数具有不同的用途和要求的事实是拥有两种类型的类型参数的要点,如果它们的特征相同,则我们将不需要它们中的两个。

请注意,过程对参数化派生类型的虚拟参数的kind参数的要求与对内在类型虚拟参数的kind s的要求相同:在编译时定义其值时间。