将子类型的指针传递给带有父类指针的伪参数

时间:2017-07-25 04:12:32

标签: fortran

当我尝试将扩展类型的指针传递给一个带有指向父类型类的指针的例程时,我得到一个类型不匹配错误。但是,在伪参数不是指针的第二种情况下,它编译得很好。

child_type是一个parent_type类,它们都有指针属性,所以一切似乎都匹配,并且当伪参数不是指针时它起作用。

那么,如果伪参数是一个指针,为什么会失败呢?

module wrong_type_test
  implicit none

  type parent_type
     integer :: a
  end type parent_type

  type, extends(parent_type) :: child_type
     integer :: b
  end type child_type

contains

  subroutine ptr_test(parent_ptr)
    class(parent_type), pointer, intent(inout) :: parent_ptr
    print *, "test"
  end subroutine ptr_test

  subroutine non_ptr_test(parent)
    class(parent_type), intent(inout) :: parent
    print *, "test"
  end subroutine non_ptr_test

end module wrong_type_test

program test
  use wrong_type_test
  implicit none

  class(child_type), pointer :: child_ptr

  call non_ptr_test(child_ptr) !this works
  call ptr_test(child_ptr) !this doesn't work
end program test

ifort错误:

select_type_pointer_test.f90(33): error #6633: The type of the actual argument differs from the type of the dummy argument.   [CHILD_PTR]
  call ptr_test(child_ptr)

gfortran错误:

Error: Actual argument to 'parent_ptr' at (1) must have the same declared type

1 个答案:

答案 0 :(得分:2)

在指针伪参数的情况下,该过程可以将指针重新关联到与实际参数具有不同扩展类型的对象。这不是一件明智的事情,所以语言禁止它。

通常,当您想要执行与参数的指针关联状态相关的操作时,伪参数应该只是指针。