2017-07-25 3 views
1

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 

Antwort

2

im Zeigerscheinargument Fall kann das Verfahren, um den Zeiger auf ein Objekt reassoziieren, die von einer anderen Nebenstelle Typ ist zum eigentlichen Argument. Das ist keine vernünftige Sache, deshalb verbietet die Sprache es.

Im Allgemeinen sollten Dummy-Argumente nur Zeiger sein, wenn Sie etwas im Zusammenhang mit dem Zeigerzuordnungsstatus des Arguments tun möchten.

+0

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

+1

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

Verwandte Themen