带有类型参数的派生类型作为子程序参数

3

假设我们有以下代码:

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”既不能被假定也不能被推迟

如果我将上述代码更改为

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

这段代码可以在两个编译器上编译通过。

是否可能编写一个子程序,其中kind参数不需要显式指定?在上面的示例中,对于INT32INT64等,代码将相同,我不想为每个可想象的kind参数值复制粘贴它。len参数可以正常工作。为什么我不能对kind参数执行相同的操作?


2
派生类型的种类参数在这方面与内置类型相同。如果您理解了这些规则,可能就没有太多要补充的了。 - francescalus
可能是重复的问题?https://stackoverflow.com/questions/51133634/how-to-pass-the-kind-for-real-precision-to-functions-and-subroutines-in-fortran - Rodrigo Rodrigues
1个回答

4
有没有可能编写一个子程序,其中kind参数不需要明确指定?
不可以,kind类型参数需要通过常量表达式给出或者设置默认值,例如Fortran 2008标准中定义的1.3.147.12.3。
为什么我不能用相同的方式处理kind参数? len和kind类型参数具有不同的用途和要求,这就是为什么有两种类型的类型参数的原因,如果它们的特征相同,我们就不需要两种类型。
请注意,过程对其参数化派生类型的虚拟参数的kind参数的要求与对其内部类型的虚拟参数的kind参数的要求相同:在编译时定义其值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接