代码之家  ›  专栏  ›  技术社区  ›  Laurent

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

  •  2
  • Laurent  · 技术社区  · 6 年前

    假设我们有以下代码:

    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参数做同样的操作?

    1 回复  |  直到 6 年前
        1
  •  3
  •   jme52    6 年前

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

    不, kind 类型参数需要由常量表达式给出或默认,请参见,例如Fortran 2008标准,定义1.3.147.12.3。

    为什么不能对kind参数做同样的操作?

    事实上 len 友善的 类型参数有不同的用途和需求是有两种类型类型参数的关键,如果它们的特性相同,我们就不需要其中的两种。

    注意程序要求 友善的 参数化派生类型的伪参数的参数与 友善的 它们内在类型的伪参数:在编译时定义它们的值。

    推荐文章