tag print get_the_tags get_term custom all function fortran user-defined-types fortran2003

function - print - wordpress get all tags



Pasar procedimientos enlazados de tipo como argumentos (2)

No nos mostró el mensaje de error exacto que recibió, y no intenté su ejemplo yo mismo, pero estoy bastante seguro de que el problema es que la interfaz del argumento ficticio de procedimiento no se corresponde con la interfaz de la real argumento que se le pasa.

Más explícitamente, random_subroutine se declara como tomar dos argumentos, mientras que test_obj%add_integers_up toma tres argumentos; aunque uno de ellos funciona como el argumento ficticio de objeto pasado, todavía cuenta como parte de la interfaz de ese procedimiento.

Estoy tratando de pasar un procedimiento vinculado a un tipo como un argumento a otra subrutina. Quiero saber si esto es posible en Fortran. Aquí hay un fragmento de código que muestra lo que intento hacer.

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

¿Es esto posible en Fortran? Obtengo un error de compilación cuando trato de compilar este código usando ifort.


test_obj% add_integers_up no es un procedimiento; es un enlace que resulta ser un procedimiento llamado add_integers_up. No puede pasar un enlace como un argumento real.

Si desea pasar el procedimiento específico al que está asociado el enlace, ¡pase el procedimiento! Hipotéticamente:

call print_result_of_subroutine(i4, add_integers_up)

Pero como han señalado otros carteles, en su código de ejemplo, la interfaz de ese procedimiento no coincide con la interfaz del argumento ficticio correspondiente en print_result_of_subroutine.

Si test_obj% add_integers_up se refería a un componente de puntero de procedimiento asociado (y la interfaz para ese componente coincidía con lo esperado por print_result_of_subroutine), entonces las cosas funcionarían como parece estar esperando.

Tenga en cuenta que Fortran 90 no es compatible con los procedimientos de tipo enlazado (o los componentes de puntero de procedimiento); su código requiere mucho Fortran 2003.