我试图将任何类型的值保存在无限多态类指针中,然后使用将返回值作为特定类型的函数来检索该值。到目前为止,我只为整数编写了代码。
文件名:pointers.f90
module pointers_example
contains
subroutine assign_int(pt,val)
class(*),allocatable,target :: temp
class(*),pointer,intent(inout) :: pt
integer,intent(in) :: val
allocate(temp,source=val)
pt => temp
end subroutine assign_int
pure function int_val(pt) result (val)
class(*),intent(in) :: pt
integer :: val
select type(v => pt)
type is (integer)
val = v
end select
return
end function int_val
end module pointers_example
program main
use pointers_example
implicit none
class(*),pointer :: pt
integer :: i = 10
integer :: output_unit = 6
call assign_int(pt,10)
write(output_unit,'("1. int_val(pt) = ",I2)') int_val(pt)
write(output_unit,'("i == int_val(pt)? ",L1)') int_val(pt) == i
write(output_unit,'("i = ",I2)') i
write(output_unit,'("2. int_val(pt) = ",I2)') int_val(pt)
write(output_unit,'("i == int_val(pt)? ",L1)') int_val(pt) == i
call assign_int(pt,10)
write(output_unit,'("3. int_val(pt) = ",I2)') int_val(pt)
end program main
[当我使用gfortran进行编译并运行代码时,我得到了:
$ gfortran -o pointers pointers.f90 ; ./pointers
1. int_val(pt) = 10
i == int_val(pt)? T
i = 10
2. int_val(pt) = **
i == int_val(pt)? F
3. int_val(pt) = 0
在第二种情况下,我不希望int_val(pt)== **。比较int_val(i)==我似乎暗示它们都是在调用write(output_unit,'(“ i =”,I2)')i之前具有相同值的整数,但它们不是之后一样。似乎还不知道在打印到控制台之外进行写操作还有其他副作用。谁能解释这种行为?
感谢@evets的回应,我找到了解决方案。我已将旧代码留在注释中:
subroutine assign_int(pt,val)
!class(*),allocatable,target :: temp
class(*),pointer,intent(inout) :: pt
integer,target,intent(in) :: val
! allocate(pt,source=val)
! pt => temp
pt => val
end subroutine assign_int
基本上,临时(temp)指针已被释放,因为它尚未保存并且未被assign_int函数返回。根据Fortran标准“ 19.5.2.5:当...(3)指针的目标不是通过指针释放时,指针的关联状态变为未定义”,则pt目标未定义。