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