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.