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.
<strong>Capítulo</strong> <strong>8.</strong> Sub-Programas e Módulos 117<br />
INTERFACE <br />
[]<br />
[MODULE PROCEDURE ]<br />
! Em Fortran 95 blocos de interfaces e declaraç~oes MODULE PROCEDURE<br />
! podem aparecer em qualquer ordem.<br />
END INTERFACE []<br />
! Somente em Fortran 95 o nome genérico é aceito aqui.<br />
Deve-se notar que todos os nomes na devem ser de rotinas de módulo acessíveis; portanto,<br />
elas não necessariamente devem estar definidas no mesmo módulo onde a interface genérica é estabelecida,<br />
bastando que elas sejam acessíveis por associação de uso.<br />
Para demonstrar o poderio de uma interface genérica, será utilizada novamente a subrotina TROCA, a qual<br />
foi definida primeiramente na página 97 e depois, na forma de uma subrotina elemental, na seção <strong>8.</strong>2.17. O<br />
módulo gentroca na página 118 define o nome genérico de uma série de subrotinas elementais TROCA associadas<br />
a variáveis dos tipos real, inteiro, lógico e do tipo derivado ponto, o qual é definido no mesmo módulo.<br />
Este módulo é utilizado então em duas situações distintas. Na primeira vez, o módulo será utilizado para<br />
trocar o valor de duas variáveis escalares do tipo ponto, como no programa usa gentroca.f90 na página 119.<br />
Posteriormente, o mesmo módulo será utilizado para trocar os elementos de duas matrizes inteiras, como<br />
no programa usa_gt_mat.f90, também listado na página 119.<br />
Uma declaração MODULE PROCEDURE somente é permitida se um é fornecido. Porém,<br />
o nome genérico pode ser igual ao nome de uma das rotinas declaradas na . Em<br />
conjunto com esta propriedade, o nome genérico definido em um módulo pode ser o mesmo de outro nome<br />
genérico acessível ao módulo, inclusive no caso onde o nome genérico corresponde ao de uma rotina intrínseca.<br />
Neste caso, o módulo estará estendendo o intervalo de aplicação de uma rotina intrínseca.<br />
As rotinas às quais são dadas um certo nome genérico devem ser todas ou subrotinas ou funções, incluindo<br />
as intrínsecas quando uma rotina intrínseca é estendida. Quaisquer duas rotinas não-intrínsecas associadas ao<br />
mesmo nome genérico devem ter argumentos que diferem de tal forma que qualquer invocação é feita de forma<br />
inequívoca. As regras são que:<br />
1. uma delas tenha mais argumentos obrigatórios mudos de um tipo, espécie e posto particulares que a outra<br />
ou<br />
2. que ao menos uma delas tenha um argumento mudo obrigatório tal que<br />
(a) corresponda por posição na lista de argumentos a um argumento mudo que não esteja presente na<br />
outra, ou esteja presente com um tipo e/ou espécie distinta ou com posto distinto, e<br />
(b) corresponda por nome a um argumento mudo que não esteja presente na outra, ou presente com tipo<br />
e/ou espécie diferente ou com posto diferente.<br />
Para o caso (2), ambas as regras são necessárias para descartar a possibilidade de invocação ambígua por uso<br />
de palavras-chave. Como exemplo onde haverá ambigüidade, o exemplo abaixo:<br />
!Exemplo de definiç~ao ambígua de nome genérico<br />
INTERFACE F<br />
MODULE PROCEDURE FXI, FIX<br />
END INTERFACE F<br />
CONTAINS<br />
FUNCTION FXI(X,I)<br />
REAL :: FXI<br />
REAL, INTENT(IN) :: X<br />
INTEGER, INTENT(IN) :: I<br />
...<br />
END FUNCTION FXI<br />
!<br />
FUNCTION FIX(I,X)<br />
REAL :: FIX<br />
REAL, INTEN(IN) :: X<br />
Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008