PASANDO PROCEDIMIENTOS A OTROS PROCEDIMIENTOS
Tanto funciones como subrutinas pueden ser pasados como argumentos
Ej :
PROGRAM : : test
REAL, EXTERNAL : : fun1, fun2
REAL : : x, y, salida
………..
CALL evaluar( fun1, x, y, salida)
CALL evaluar( fun1, x, y, salida)
END PROGRAM : : test
****************************************
SUROUTINE evaluar( fun, a, b, resultado)
REAL , EXTERNAL : : fun
REAL, INTENT(IN) : : a, b
REAL , INTENT (OUT) resultado
resultado= b * fun(a)
END SUROUTINE evaluar
fun1 y fun2 → funciones definidas por el usuario
EXTERNAL → Le comunica al compilador que en vez de una variable, el
argumento es una función compilada separadamente.
Puede ser una sentencia de declaración o una sentencia
REAL, EXTERNAL : : fun1, fun2
o
EXTERNAL fun1, fun2
Si se usa esta última opción tiene que usarse antes del llamado por la subrutina
Ej:
REAL, FUNCTION valor_medio (fun, val_1, val_ fin, n)
! Propósito: calcular el promedio de fun
!
! Diccionario y declaración de variables
REAL, EXTERNAL : : fun
! Función a ser evaluada
REAL, INTENT(IN) : : val_1
! Primer valor en el rango
REAL, INTENT(IN) : : val_fin
!último valor en el rango
INTEGER, INTENT(IN) : : n
!
REAL : : DELTA
INTEGER : : i
REAL : : sum
!
delta= (val_fin - val_1) / REAL(n - 1)
! Calculo la suma
sum=0
DO i=1,n
sum = sum + func (REAL( i – 1 )* delta)
END DO
! Saco el promedio
valor_medio = sum / REAL(n)
END FUNCTION valor_medio
PROGRAM test_ valor medio
! Propósito: evaluar la función valor_medio
IMPLICIT NONE
! Diccionario y declaración de variables
REAL, EXTERNAL : : mi_función ! Función a ser evaluada
REAL, INTENT(IN) : : valor_medio ! Valor medio de la función
REAL : : medio
! promedio de la función
medio = valor_medio (mi_funcion, 0., 1., 101)
WRITE( *, * ) “mi función”, medio
END PROGRAM test_ valor medio
REAL FUNCTION mi_funcion(x)
IMPLICIT NONE
REAL, INTENT(IN)
mi_funcion =3* x
END FUNCTION mi_funcion
Descargar

Diapositiva 1