Passare le procedure legate al tipo come argomenti

Sto provando a passare una procedura legata al tipo come argomento ad un’altra subroutine. Voglio sapere se questo è ansible in Fortran. Ecco uno snippet di codice che mostra ciò che sto cercando di fare.

module type_definitions type test_type integer :: i1, i2,i3 contains procedure :: add_integers_up end type test_type contains subroutine add_integers_up(this,i4,ans) class(test_type) :: this integer :: i4,ans ans = this%i1+this%i2+this%i3+i4 end subroutine add_integers_up subroutine print_result_of_subroutine(i4,random_subroutine) integer :: i4,ans interface subroutine random_subroutine(i1,i2) integer:: i1,i2 end subroutine random_subroutine end interface call random_subroutine(i4,ans) write(*,*) ans end subroutine print_result_of_subroutine end module type_definitions program main use type_definitions implicit none integer :: i1,i2,i3,i4 integer :: ans type(test_type) :: test_obj i1 =1; i2=2; i3=3 test_obj%i1 = i1 test_obj%i2 = i2 test_obj%i3 = i3 i4 = 4 call print_result_of_subroutine(i4,test_obj%add_integers_up) end program main 

È ansible farlo in Fortran? Ottengo un errore del compilatore quando provo a compilare questo codice usando ifort.

test_obj% add_integers_up non è una procedura – si tratta di un legame che si verifica in una procedura chiamata add_integers_up. Non è ansible passare un’associazione come argomento reale.

Se si desidera passare la procedura specifica a cui è associata l’associazione, passare la procedura! Ipoteticamente:

 call print_result_of_subroutine(i4, add_integers_up) 

Ma come altri utenti hanno notato, nel codice di esempio l’interfaccia di quella procedura non corrisponde all’interfaccia dell’argomento fittizio corrispondente in print_result_of_subroutine.

Se test_obj% add_integers_up faceva riferimento a un componente puntatore di procedura associato (e l’interfaccia per quel componente corrispondeva a quanto ci si aspettava da print_result_of_subroutine), le cose funzionerebbero come sembra che ti aspetti.

Notare che Fortran 90 non supporta le procedure di tipo vincolato (oi componenti del puntatore di procedura): il codice richiede molto Fortran 2003.

Non ci hai mostrato l’esatto messaggio di errore che hai ricevuto, e non ho provato il tuo esempio da solo, ma sono abbastanza sicuro che il problema è che l’interfaccia dell’argomento fittizio della procedura non corrisponde all’interfaccia dell’attuale argomento che è passato ad esso.

Più esplicitamente, random_subroutine viene dichiarata come prendendo due argomenti, mentre test_obj%add_integers_up accetta tre argomenti; anche se uno di questi funziona come argomento fittizio dell’object passato, conta ancora come parte dell’interfaccia di quella procedura.