下面的示例使用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
错误的行为还是我做错了什么?如果它是一个错误,我能做些什么来防止它?