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.

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

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

Saved successfully!

Ooh no, something went wrong!