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.
TEMP= A<br />
A= B<br />
B= TEMP<br />
RETURN<br />
END SUBROUTINE TROCA<br />
<strong>Capítulo</strong> <strong>8.</strong> Sub-Programas e Módulos 109<br />
chamar esta subrotina com um argumento escalar e um matricial está obviamente errado, uma vez que o<br />
mecanismo de distribuir o valor da variável escalar por uma matriz conformável com o outro argumento não<br />
pode ser aplicado aqui.<br />
Se a referência a uma rotina genérica (seção <strong>8.</strong>3.4) é consistente tanto com uma rotina elemental quanto com<br />
uma não-elemental, a segunda versão é invocada, pois espera-se que a versão elemental de uma rotina rode, em<br />
geral, mais lentamente.<br />
Finalmente, uma rotina elemental não pode ser usada como um argumento real de outra rotina.<br />
<strong>8.</strong>3 Módulos<br />
Uma das novidades mais importantes introduzidas pelo Fortran 90 é um novo tipo de unidade de programa<br />
denominada módulo. Um módulo é um recurso muito poderoso para transferir dados entre sub-programas e<br />
para organizar a arquitetura global de um programa grande e complexo.<br />
A funcionalidade de um módulo pode ser explorada por qualquer unidade de programa que deseja fazer uso<br />
(através de uma instrução USE) dos recursos disponibilizados por este. Os recursos que podem ser incluídos em<br />
um módulo são os seguintes:<br />
Declaração de objetos globais. Módulos devem ser empregados no lugar das declarações COMMON e INCLUDE,<br />
comuns no Fortran 77. Se dados globais são necessários, por exemplo para transferir valores entre rotinas,<br />
então estes são são tornados visíveis sempre que o módulo é usado. Objetos em um módulo podem ser<br />
inicializados com valores estáticos, de tal forma que estes mantêm seu valor em diferentes unidades que<br />
usam o mesmo módulo.<br />
Blocos de interfaces. Na maior parte das situações é vantajoso congregar todos os blocos de interfaces em<br />
um ou poucos módulos e então usar o módulo sempre que uma interface explícita é necessária. Isto pode<br />
realizado em conjunto com a cláusula ONLY.<br />
Rotinas de módulos. Rotinas podem ser definidas internamente em um módulo, sendo estas tornadas acessíveis<br />
a qualquer unidade de programa que USE o módulo. Esta estratégia é mais vantajosa que usar uma<br />
rotina externa porque em um módulo a interface das rotinas internas é sempre explícita.<br />
Acesso controlado a objetos. Variáveis, rotinas e declarações de operadores podem ter a sua visibilidade<br />
controlada por declarações ou atributos de acesso dentro de um módulo. Desta forma, é possível especificar<br />
que um determinado objeto seja visível somente no interior do módulo. Este recurso é freqüentemente<br />
utilizado para impedir que um usuário possa alterar o valor de um objeto de âmbito puramente interno<br />
ao módulo.<br />
Interfaces genéricas. Um módulo pode ser usado para definir um nome genérico para um conjunto de rotinas,<br />
com interfaces distintas, mas que executem todas a mesma função. Interfaces genéricas podem ser usadas<br />
também para estender a funcionalidade de rotinas intrínsecas.<br />
Sobrecarga de operadores. Um módulo pode ser usado também para redefinir a operação executada pelos<br />
operadores intrínsecos da linguagem (= + - * / **) ou para definir novos tipos de operadores.<br />
Extensão semântica. Um módulo de extensão semântica é uma coleção de definições de tipos derivados,<br />
rotinas e operadores sobrecarregados tais que, quando agregados a uma unidade de programa, permitem<br />
que o usuário use esta funcionalidade estendida como se fizesse parte da linguagem padrão.<br />
A forma geral de um módulo é:<br />
MODULE <br />
<br />
<br />
[CONTAINS<br />
]<br />
END [MODULE []]<br />
Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008