Sesion-12-Subrutinas-pptx (Okc)
Sesion-12-Subrutinas-pptx (Okc)
Sesion-12-Subrutinas-pptx (Okc)
f90
Subrutinas
Subrutinas
• Son procedimientos más generales que las funciones, aunque comparten
casi todas sus características.
• Pueden retornar más de un valor, o no retornar nada en absoluto.
• Cabecera de subrutina
• Sección de especificaciones
• Sección de ejecución
• Terminación de la subrutina
PROGRAM CARLOS
Definición de variables
……
……
CALL nombre_subrutina (a,b,c,d,e)
……
……
END PROGRAM CARLOS
SUBROUTINE nombre_subrutina(a,b,c,d,e)
Definición de variables
……
SENTENCIA1
SENTENCIA2
……
Sección de especificaciones:
• Debe incluir la declaración de los tipos de los argumentos formales con su atributo
INTENT correspondiente a su intención de uso y la de las variables locales a la
subrutina, si las hay.
Sección de ejecución:
• Debe incluir al menos las sentencia de asignación en la que se asignen valores a los
argumentos de retorno.
Terminación:
END SUBROUTINE [nombre_subrutina]
• Delimita el fin de la definición de la subrutina y produce el retorno al punto de llamada.
El retorno también se puede forzar mediante instrucciones RETURN.
Llamada a una subrutina
Llamada a una subrutina desde cualquier unidad de programa:
La subrutina NO devuelve ningún valor a través de su nombre, sino que son los argumentos
los encargados de realizar las transferencias de resultados.
Debe haber concordancia en el número, tipo y orden de los argumentos actuales y sus
correspondientes argumentos formales, al igual que en las funciones.
Relación de variables en una subrutina
call trapzd(f,a,b,s,i)
SUBROUTINE trapzd(func,a,b,s,n)
Programa con el mismo resultado usando función y subrutina
FUNCION SUBRUTINA
WRITE(*,*)X WRITE(*,*)X
!-------------------------------- !--------------------------------
CALL RAICES()
!-------------------------------------------
SUBROUTINE RAICES()
REAL::A=2,B=5,C=2,X1,X2
X1=(-B+SQRT(B**2-4*A*C))/(2*A)
X2=(-B-SQRT(B**2-4*A*C))/(2*A)
WRITE(*,'(F5.1)')X1
WRITE(*,'(F5.1)')X2
!---------------------------- !----------------------------
…
CALL proced (matriz, d1, d2, resul) !llamada a subrutina
…
SUBROUTINE proced (matriz, d1, d2, resul)
INTEGER, INTENT(IN):: d1,d2
INTEGER, INTENT(IN), DIMENSION(d1,d2)::matriz ! perfil explícito
INTEGER, INTENT(OUT):: resul
Transferencia de arrays a procedimientos
• arreglo formal con perfil asumido.
La declaración de un array formal de este tipo usa dos puntos, : , para cada
índice. Ejemplo:
MODULE mod1
CONTAINS
Para guardar todas las variables locales a un procedimiento escribir simplemente SAVE en
una sentencia ubicada en la sección de especificaciones del procedimiento.
• Ejemplo:
INTEGER FUNCTION fun(N)
INTEGER INTENT(IN):: N
INTEGER, SAVE:: cuenta
CONTAINS
FUNCTION F1(y)
REAL :: y
F1=-y
END FUNCTION F1
FUNCTION F2(t)
REAL :: t,m
m=m0*(1.0 + mdot*t/m0)
F2=c*mdot/m+g
END FUNCTION F2