SELECT TYPE具有到CHARACTER(*)变量的无限多态指针

时间:2014-06-02 13:18:34

标签: fortran gfortran fortran2003

以下示例使用Fortran 2003功能定义无限多态指针,并根据select type构造后面的变量类型执行操作。子例程handleP根据其类型打印参数的值。

program example
    implicit none
    type name
        character(22) :: n
    end type

    character(len=7) :: mystring
    mystring = 'Initial'

    call handleP(mystring)
    call handleP('Initial')
    call handleP(name('Initial'))

    contains

        subroutine handleP(p)
            class(*), intent(in) :: p

            select type(p)
            type is (character(len=*))
                write(*,*) len(p), ': ', p
            class is (name)
                write(*,*) len(p%n), ': ', p%n
            class default
                write(*,*) 'Unknown type'
            end select
        end subroutine

end program example

使用gfortran版本4.8进行编译得到以下输出:

       7 : Initial
       0 :
      22 : Initial

因此,call handleP(mystring)一切都按预期工作,但call handleP('Initial')打印失败。使用type(name)参数调用也可以。

call handleP('Initial')的行为是gfortran错误还是我做错了?如果是一个bug,我该怎么做才能阻止它呢?

2 个答案:

答案 0 :(得分:2)

我只是想让大家知道这个问题是在当前MinGW安装附带的gFortran 4.9.3-1下修复的。

答案 1 :(得分:0)

这可能是你想要的:

program example
    implicit none
    type name1
        character(22) :: n
    end type

    character(len=7) :: mystring
    mystring = 'Initial'

    call handleP(mystring)
    call handleP('Initial')
    call handleP(name1('Initial'))

    contains

        subroutine handleP(p)
            class(*), intent(in) :: p

            select type(p)
            type is (character(len=*))
                write(*,*) len(p), ': ', p
            class is (name1)
                write(*,*) len(trim(adjustl(p%n))), ': ', p%n
            class default
                write(*,*) 'Unknown type'
            end select
        end subroutine

end program example

第二个电话不起作用,因为' Initial'不是变量。之前的22只是您在类型声明中定义的长度。所以我调整了它的长度。