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.

<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

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

Saved successfully!

Ooh no, something went wrong!