说我们有以下代码:
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参数的情况下编写子例程?在上面的示例中,INT32
,INT64
,...的代码是相同的,并且我不想为kind参数的每个可想象的值复制粘贴它。对于len参数,它工作正常。为什么我不能对kind参数做同样的事情?
答案 0 :(得分:3)
是否可以在不需要显式指定kind参数的情况下编写子例程?
否,kind
类型的参数需要由常量表达式指定或默认设置,请参见例如Fortran 2008标准,定义1.3.147.12.3。
为什么不能对kind参数做同样的事情?
len
和kind
类型参数具有不同的用途和要求的事实是拥有两种类型的类型参数的要点,如果它们的特征相同,则我们将不需要它们中的两个。
请注意,过程对参数化派生类型的虚拟参数的kind
参数的要求与对内在类型虚拟参数的kind
s的要求相同:在编译时定义其值时间。