假设我们有以下代码:
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编译器说
非法的选择器种类值必须为非负 假定类型参数(*)不能与非长度类型参数p一起使用
而格佛特兰
在(1)处的种类参数“p”不能被假定或推迟
如果我把上面的代码改成
subroutine barsub (this) class(bar(INT32,*)), intent(in) :: this write (*,*) this%x end subroutine barsub
两个编译器都能很好地编译。
是否可以在不需要显式指定kind参数的情况下编写子例程?在上面的例子中,对于 INT32 我是说, INT64 ,…我不想为kind参数的每个可想象的值复制粘贴它。它对len参数很好。为什么不能对kind参数做同样的操作?
INT32
INT64
是否可以在不需要显式指定kind参数的情况下编写子例程?
不, kind 类型参数需要由常量表达式给出或默认,请参见,例如Fortran 2008标准,定义1.3.147.12.3。
kind
为什么不能对kind参数做同样的操作?
事实上 len 和 友善的 类型参数有不同的用途和需求是有两种类型类型参数的关键,如果它们的特性相同,我们就不需要其中的两种。
len
友善的
注意程序要求 友善的 参数化派生类型的伪参数的参数与 友善的 它们内在类型的伪参数:在编译时定义它们的值。