24.07.2013 Views

Capítulo 8. Funções e Subrotinas - UFMG

Capítulo 8. Funções e Subrotinas - UFMG

Capítulo 8. Funções e Subrotinas - UFMG

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!