verwendet Wenn ich versuche, einen Zeiger eines erweiterten Typs an eine Routine übergeben, die einen Zeiger auf die Klasse des übergeordneten Typs nimmt, erhalte ich einen Typkonfliktfehler . Im zweiten Fall, in dem das Dummy-Argument kein Zeiger ist, wird es jedoch gut übersetzt.Übergeben Sie Zeiger des unterordneten Typs an Dummy-Argument, das einen Zeiger der übergeordneten Klasse
Der child_type ist eine Klasse von parent_type und beide haben das Zeigerattribut, also scheint alles übereinzustimmen, und es funktioniert, wenn das Dummy-Argument kein Zeiger ist.
Also, warum schlägt es fehl, wenn das Dummy-Argument ein Zeiger ist?
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 Fehler:
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 Fehler:
Error: Actual argument to 'parent_ptr' at (1) must have the same declared type
Wie können Sie den Zeiger mit etwas verknüpfen, das keine Erweiterung des übergeordneten Typs ist? Wenn der Zeiger vom Kindtyp ist, dann muss nichts, auf das er zeigt, auch eine Erweiterung des Elterntyps sein? – Exascale
Innerhalb der Prozedur ist der deklarierte Typ des Zeigers der übergeordnete Typ. Innerhalb der Prozedur kann der Zeiger dann auf einen anderen Typ gerichtet werden, der ein * Geschwister * (oder eine Erweiterung eines Geschwisters) Ihres Kindtyps ist - gemeinsames Elternteil, verschiedene Erweiterungen. Wenn dann die Prozedur endet und die Ausführung wieder im aufrufenden Bereich ist, ergibt sich Chaos. – IanH