Capítulo 8. Funções e Subrotinas - UFMG
Capítulo 8. Funções e Subrotinas - UFMG
Capítulo 8. Funções e Subrotinas - UFMG
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
114 <strong>8.</strong>3. Módulos<br />
FUNCTION FF(X)<br />
REAL :: FF<br />
REAL, INTENT(IN) :: X<br />
FF= EXP(-ALFA*X*X)<br />
FF= FF*X2(X)<br />
RETURN<br />
CONTAINS<br />
FUNCTION X2(Y)<br />
REAL :: X2<br />
REAL, INTENT(IN) :: Y<br />
X2= Y**2<br />
RETURN<br />
END FUNCTION X2<br />
END FUNCTION FF<br />
END MODULE INTEG<br />
A outra grande diferença está no fato de que as interfaces das rotinas de módulo são explícitas no âmbito deste.<br />
Todavia, quando uma outra unidade de programa usa o módulo, todas os objetos públicos nele contidos se<br />
tornam acessíveis a esta, resultando que as interfaces das rotinas de módulo são automaticamente explícitas<br />
também para a unidade de programa que o invoca. Portanto, um módulo é considerado a unidade ideal para<br />
armazenar grupos de sub-programas criados para desempenhar uma determinada tarefa, juntamente com os<br />
objetos globais associados a estes sub-programas.<br />
Ao se compilar um arquivo contendo um módulo, os compiladores automaticamente geram um novo tipo de<br />
arquivo, geralmente com a extensão *.mod, onde as informações contidas no módulo, tais como variáveis globais e<br />
interfaces, são armazenadas. Quando uma outra unidade de programa faz referência a este módulo, o compilador<br />
busca estas informações no arquivo .mod . Desta forma, cria-se um mecanismo para verificar se as variáveis e as<br />
interfaces estão sendo corretamente utilizadas pela unidade que chama o módulo. Quando o módulo não define<br />
um rotina interna, não é necessário guardar o arquivo objeto (*.o ou *.obj) associado, bastando guardar o<br />
arquivo *.mod. Por esta razão, muitos compiladores oferecem uma chave extra de compilação através da qual<br />
nenhum arquivo objeto é criado, mas somente o arquivo de módulo.<br />
Rotinas de módulo pode ser úteis por diversas razões. Por exemplo, um módulo que define a estrutura de um<br />
conjunto particular de dados pode também incluir rotinas especiais, necessárias para operar com estes dados;<br />
ou um módulo pode ser usado para conter uma biblioteca de rotinas relacionadas entre si.<br />
Como exemplo, um módulo pode ser usado para “adicionar” variáveis de tipo derivado:<br />
MODULE MOD_PONTO<br />
IMPLICIT NONE<br />
TYPE :: PONTO<br />
REAL :: X, Y<br />
END TYPE PONTO<br />
CONTAINS<br />
FUNCTION ADPONTOS(P,Q)<br />
TYPE(POINT) :: ADPONTOS<br />
TYPE(POINT), INTENT(IN) :: P, Q<br />
ADPONTOS%X= P%X + Q%X<br />
ADPONTOS%Y= P%Y + Q%Y<br />
RETURN<br />
END FUNCTION ADPONTOS<br />
END MODULE MOD_PONTO<br />
Neste caso, o programa principal usa este módulo:<br />
PROGRAM P_PONTO<br />
USE MOD_PONTO<br />
IMPLICIT NONE<br />
TYPE(POINT) :: PX, PY, PZ<br />
...<br />
PZ= ADPONTO(PX,PY)<br />
...<br />
END PROGRAM P_PONTO<br />
Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008