Fortran - Módulos
Un módulo es como un paquete donde puede guardar sus funciones y subrutinas, en caso de que esté escribiendo un programa muy grande, o sus funciones o subrutinas se pueden usar en más de un programa.
Los módulos le brindan una forma de dividir sus programas entre varios archivos.
Los módulos se utilizan para:
Empaquetado de subprogramas, datos y bloques de interfaz.
Definición de datos globales que pueden ser utilizados por más de una rutina.
Declarar variables que pueden estar disponibles dentro de las rutinas que elija.
Importar un módulo por completo, para su uso, en otro programa o subrutina.
Sintaxis de un módulo
Un módulo consta de dos partes:
- una parte de especificación para declaración de declaraciones
- a contiene parte para las definiciones de subrutinas y funciones
La forma general de un módulo es:
module name
[statement declarations]
[contains [subroutine and function definitions] ]
end module [name]
Uso de un módulo en su programa
Puede incorporar un módulo en un programa o subrutina mediante la declaración de uso:
use name
Tenga en cuenta que
Puede agregar tantos módulos como necesite, cada uno estará en archivos separados y se compilará por separado.
Un módulo se puede utilizar en varios programas diferentes.
Un módulo se puede utilizar muchas veces en el mismo programa.
Las variables declaradas en una parte de especificación del módulo son globales para el módulo.
Las variables declaradas en un módulo se convierten en variables globales en cualquier programa o rutina donde se utilice el módulo.
La declaración de uso puede aparecer en el programa principal o en cualquier otra subrutina o módulo que utilice las rutinas o variables declaradas en un módulo en particular.
Ejemplo
El siguiente ejemplo demuestra el concepto:
module constants
implicit none
real, parameter :: pi = 3.1415926536
real, parameter :: e = 2.7182818285
contains
subroutine show_consts()
print*, "Pi = ", pi
print*, "e = ", e
end subroutine show_consts
end module constants
program module_example
use constants
implicit none
real :: x, ePowerx, area, radius
x = 2.0
radius = 7.0
ePowerx = e ** x
area = pi * radius**2
call show_consts()
print*, "e raised to the power of 2.0 = ", ePowerx
print*, "Area of a circle with radius 7.0 = ", area
end program module_example
Cuando compila y ejecuta el programa anterior, produce el siguiente resultado:
Pi = 3.14159274
e = 2.71828175
e raised to the power of 2.0 = 7.38905573
Area of a circle with radius 7.0 = 153.938049
Accesibilidad de variables y subrutinas en un módulo
De forma predeterminada, todas las variables y subrutinas de un módulo están disponibles para el programa que está utilizando el código del módulo, use declaración.
Sin embargo, puede controlar la accesibilidad del código del módulo utilizando el private y publicatributos. Cuando declaras alguna variable o subrutina como privada, no está disponible fuera del módulo.
Ejemplo
El siguiente ejemplo ilustra el concepto:
En el ejemplo anterior, teníamos dos variables de módulo, e y pi. Hagámoslos privados y observemos el resultado:
module constants
implicit none
real, parameter,private :: pi = 3.1415926536
real, parameter, private :: e = 2.7182818285
contains
subroutine show_consts()
print*, "Pi = ", pi
print*, "e = ", e
end subroutine show_consts
end module constants
program module_example
use constants
implicit none
real :: x, ePowerx, area, radius
x = 2.0
radius = 7.0
ePowerx = e ** x
area = pi * radius**2
call show_consts()
print*, "e raised to the power of 2.0 = ", ePowerx
print*, "Area of a circle with radius 7.0 = ", area
end program module_example
Cuando compila y ejecuta el programa anterior, aparece el siguiente mensaje de error:
ePowerx = e ** x
1
Error: Symbol 'e' at (1) has no IMPLICIT type
main.f95:19.13:
area = pi * radius**2
1
Error: Symbol 'pi' at (1) has no IMPLICIT type
Ya que e y pi, ambos se declaran privados, el programa module_example ya no puede acceder a estas variables.
Sin embargo, otras subrutinas del módulo pueden acceder a ellos:
module constants
implicit none
real, parameter,private :: pi = 3.1415926536
real, parameter, private :: e = 2.7182818285
contains
subroutine show_consts()
print*, "Pi = ", pi
print*, "e = ", e
end subroutine show_consts
function ePowerx(x)result(ePx)
implicit none
real::x
real::ePx
ePx = e ** x
end function ePowerx
function areaCircle(r)result(a)
implicit none
real::r
real::a
a = pi * r**2
end function areaCircle
end module constants
program module_example
use constants
implicit none
call show_consts()
Print*, "e raised to the power of 2.0 = ", ePowerx(2.0)
print*, "Area of a circle with radius 7.0 = ", areaCircle(7.0)
end program module_example
Cuando compila y ejecuta el programa anterior, produce el siguiente resultado:
Pi = 3.14159274
e = 2.71828175
e raised to the power of 2.0 = 7.38905573
Area of a circle with radius 7.0 = 153.938049