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.
106 <strong>8.</strong>2. sub-programas<br />
A= 0.0<br />
ELSE<br />
A= A + X<br />
END IF<br />
...<br />
RETURN<br />
END SUBROUTINE CONTA_SOMA<br />
Neste exemplo, tanto a variável A quanto CONTA têm o seu valor mantido quando a subrotina é abandonada. Isto<br />
é garantido porque a variável A é declarada com o atributo SAVE. Já a variável CONTA não precisa ser declarada<br />
com o mesmo atributo porque ela tem o seu valor inicializado na declaração. De acordo com o padrão da<br />
linguagem, as variáveis que têm o seu valor inicializado no momento da declaração automaticamente adquirem<br />
o atributo SAVE.<br />
Alternativamente ao uso do atributo, pode-se declarar uma lista de nomes de variáveis com a mesma propriedade<br />
através da declaração SAVE. Desta forma, a variável A, no exemplo acima, podia ser declarada através<br />
das linhas:<br />
...<br />
REAL :: A<br />
SAVE :: A<br />
...<br />
A forma geral desta declaração é:<br />
SAVE [[::] ]<br />
onde uma declaração SAVE sem a subseqüente equivale à mesma declaração aplicada<br />
a todos os nomes da rotina, em cujo caso nenhuma outra variável pode ser declarada com o atributo SAVE.<br />
O comando ou atributo SAVE podem aparecer no campo de declarações de um programa principal, mas neste<br />
caso o seu efeito é nulo. O uso prático deste recurso está restrito às outras unidades de programa.<br />
<strong>8.</strong>2.16 <strong>Funções</strong> de efeito lateral e rotinas puras<br />
Na seção <strong>8.</strong>2, foi mencionado que funções normalmente não alteram o valor de seus argumentos. Entretanto,<br />
em certas situações esta ação é permitida. <strong>Funções</strong> que alteram o valor de seus argumentos são denominadas<br />
funções de efeito lateral (side-effect functions).<br />
Para auxiliar na otimização do código, o padrão da linguagem estabelece uma proibição no uso de funções<br />
de efeito lateral quando o uso de tal função em uma expressão altera o valor de um outro operando na mesma<br />
expressão, seja este operando uma variável ou um argumento de uma outra função. Caso este tipo de função<br />
fosse possível neste caso, a atribuição<br />
RES= FUN1(A,B,C) + FUN2(A,B,C)<br />
onde ou FUN1 ou FUN2, ou ambas, alterassem o valor de um ou mais argumentos, a ordem de execução desta<br />
expressão seria importante; o valor de RES seria diferente caso FUN1 fosse calculada antes de FUN2 do que seria<br />
caso a ordem de cálculo fosse invertida. Exemplos de funções de efeito lateral são dados a seguir:<br />
FUNCTION FUN1(A,B,C)<br />
INTEGER :: FUN1<br />
REAL, INTENT(INOUT) :: A<br />
REAL, INTENT(IN) :: B,C<br />
A= A*A<br />
FUN1= A/B<br />
RETURN<br />
END FUNCTION FUN1<br />
-----------------------------------<br />
FUNCTION FUN2(A,B,C)<br />
INTEGER :: FUN2<br />
REAL, INTENT(INOUT) :: A<br />
REAL, INTENT(IN) :: B,C<br />
Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008