Fortran - Módulos
Um módulo é como um pacote onde você pode manter suas funções e sub-rotinas, caso esteja escrevendo um programa muito grande, ou suas funções ou sub-rotinas possam ser usadas em mais de um programa.
Módulos fornecem uma maneira de dividir seus programas entre vários arquivos.
Módulos são usados para -
Empacotando subprogramas, dados e blocos de interface.
Definindo dados globais que podem ser usados por mais de uma rotina.
Declarando variáveis que podem ser disponibilizadas em qualquer rotina que você escolher.
Importar um módulo inteiramente, para uso, em outro programa ou sub-rotina.
Sintaxe de um Módulo
Um módulo consiste em duas partes -
- uma parte de especificação para declaração de declarações
- a contém parte para definições de sub-rotina e função
A forma geral de um módulo é -
module name
[statement declarations]
[contains [subroutine and function definitions] ]
end module [name]
Usando um módulo em seu programa
Você pode incorporar um módulo em um programa ou sub-rotina pela instrução use -
use name
Observe que
Você pode adicionar quantos módulos forem necessários, cada um estará em arquivos separados e compilados separadamente.
Um módulo pode ser usado em vários programas diferentes.
Um módulo pode ser usado várias vezes no mesmo programa.
As variáveis declaradas em uma parte da especificação do módulo são globais para o módulo.
As variáveis declaradas em um módulo tornam-se variáveis globais em qualquer programa ou rotina onde o módulo é usado.
A instrução de uso pode aparecer no programa principal, ou em qualquer outra sub-rotina ou módulo que utilize as rotinas ou variáveis declaradas em um determinado módulo.
Exemplo
O exemplo a seguir demonstra o conceito -
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
Quando você compila e executa o programa acima, ele produz o seguinte 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
Acessibilidade de variáveis e sub-rotinas em um módulo
Por padrão, todas as variáveis e sub-rotinas em um módulo são disponibilizadas para o programa que está usando o código do módulo, pelo use declaração.
No entanto, você pode controlar a acessibilidade do código do módulo usando o private e publicatributos. Quando você declara alguma variável ou sub-rotina como privada, ela não fica disponível fora do módulo.
Exemplo
O exemplo a seguir ilustra o conceito -
No exemplo anterior, tínhamos duas variáveis de módulo, e e pi. Vamos torná-los privados e observar a saída -
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
Quando você compila e executa o programa acima, ele exibe a seguinte mensagem de erro -
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
Desde a e e pi, ambos são declarados privados, o programa module_example não pode mais acessar essas variáveis.
No entanto, outras sub-rotinas do módulo podem acessá-los -
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
Quando você compila e executa o programa acima, ele produz o seguinte 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