Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
1. Programación (parte 5) 44
1.24. Creando interfases explı́citas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
1.24.1. Módulos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
1.24.2. Bloques de interfaz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
1.25. Nota sobre la representación de números reales . . . . . . . . . . . . . . . . . . . . . . . . 46
1
2 ÍNDICE
Capı́tulo 1
Programación (parte 5)
1.24.1. Módulos
Un módulo es una unidad de programa que puede compilarse separadamente y que tiene la siguiente
estructura:
MODULE nom bre_de l_modu lo
IMPLICIT NONE
( seccion_de_declaraciones )
CONTAINS
( procedimientos )
END MODULE n ombre_ del_m odulo
Ejemplo:
MODULE suma_y_promedio
CONTAINS
REAL FUNCTION suma (a ,b , c )
IMPLICIT NONE
REAL , INTENT ( IN ) :: a ,b , c
suma = a + b + c
END FUNCTION suma
REAL FUNCTION promedio (a ,b , c )
IMPLICIT NONE
REAL , INTENT ( IN ) :: a ,b , c
promedio = suma (a ,b , c )/3.
END FUNCTION promedio
END MODULE nombre_modulo
Un módulo no se puede utilizar en solitario, necesita de un programa principal. Para invocar al módulo,
el programa debe incluir la sentencia
44
1.24. CREANDO INTERFASES EXPLÍCITAS 45
USE nombre_modulo
en la sección de declaración. Utilizando módulos el compilador es capaz de detectar errores que antes no
veı́a. Supongamos que tenemos en dos archivos distintos lo siguiente:
! ******* archivo modulo_1 . f90 **********
MODULE modulo1 ! <---
CONTAINS ! <---
SUBROUTINE SUB_EJ1 ( Z )
IMPLICIT NONE
INTEGER , INTENT ( IN ) :: Z
WRITE (* ,*) Z
END SUBROUTINE SUB_EJ1
END MODULE modulo1 ! <---
(OJO, el orden importa, deben ser compilados en primer término los archivos que contienen módulos y
después los programas que los invocan.)
Como resultado, Fortran nos mostrará el siguiente mensaje de error
ej1 . f90 :6.15:
CALL SUB_EJ1 ( x )
1
Error : Type mismatch in argument ’z ’ at (1); passed REAL (4) to INTEGER (4)
que demuestra que ahora el compilador es capaz de detectar este tipo de errores.
También se podrá detectar si nos equivocáramos en el número de argumentos al llamar a la subrutina.
Supongamos que cambiamos la llamada por
CALL SUB_EJ1 (x , k )
con k previamente declarada y habiendo arreglado que la subrutina reciba un valor real. Entonces, el
mensaje al compilar serı́a:
ej1 . f90 :6.19:
CALL SUB_EJ1 (x , k )
1
Error : More actual than formal arguments in procedure call at (1)
INTERFACE
SUBROUTINE nombre_subrutina ( a r g um e n to s _ fo r m al e s )
( declaracion de argumentos formales )
END SUBROUTINE nombre_subrutina
END INTERFACE
Ası́, en esta alternativa, el programa principal del ejemplo visto antes quedarı́a:
! ******* archivo ej1 . f90 **********
PROGRAM EJ1
IMPLICIT NONE
REAL :: x =1.
INTERFACE
SUBROUTINE SUB_EJ1 ( x )
INTEGER , INTENT ( IN ) :: x
END SUBROUTINE SUB_EJ1
END INTERFACE
CALL SUB_EJ1 ( x )
END PROGRAM EJ1
Nuevamente el compilador será capaz de detectar el error por falta de concordancia en el tipo de argu-
mento.
Este problema se puede resolver con la función intrı́nseca selected real kind, pero no lo veremos en
este curso.