以下示例使用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,我该怎么做才能阻止它呢?
答案 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只是您在类型声明中定义的长度。所以我调整了它的长度。