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.

86 <strong>8.</strong>2. sub-programas<br />

vezes denominados variáveis mudas (dummy variables). Estes devem coincidir com os argumentos transferidos<br />

a partir da unidade que chama a rotina em tipo, espécie e forma. Contudo, os nomes não necessitam ser os<br />

mesmos, como se pode ver no exemplo acima. Com base no mesmo exemplo, poder-se-ia realizar duas chamadas<br />

da função calc_a_raiz:<br />

...<br />

read*, a,x<br />

print*, calc_a_raiz(x)<br />

print*, calc_a_raiz(a + x**2)<br />

...<br />

Sempre que possível, é recomendado que o nome do argumento transferido ao sub-programa seja igual ao nome<br />

da variável muda. O ponto importante é que sub-programas podem ser escritos de forma independente uns dos<br />

outros. A associação das variáveis mudas com os argumentos verdadeiros ocorrem somente quando a rotina<br />

é chamada. Desta forma, bibliotecas de sub-programas podem ser construídos, possibilitando que estes sejam<br />

usados em diferentes programas (ver seção <strong>8.</strong>2.6).<br />

O programa-exemplo bascara1, apresentado na página 87, implementa, de forma ingênua, o cálculo das raízes<br />

de um polinômio de segundo grau através da Fórmula de Báscara usando uma subrotina interna. Exemplos<br />

semelhantes a este serão usados para ilustrar o uso de rotinas em outras unidades de programa.<br />

<strong>8.</strong>2.4 Comando RETURN<br />

No padrão da linguagem, um sub-programa pode ser encerrado pelo comando END, sendo o controle do fluxo<br />

retornado à unidade que chamou este sub-programa. Contudo, o meio recomendado de se retornar controle a<br />

partir de um sub-programa consiste na utilização do comando RETURN, o qual pode surgir em mais de um ponto<br />

da rotina, ao contrário do END.<br />

Como no caso dos comandos STOP e END, o RETURN pode ser rotulado, pode fazer parte de um construto como<br />

o IF e é um comando executável. O RETURN não pode aparecer entre os comandos executáveis do programa<br />

principal.<br />

<strong>8.</strong>2.5 Atributo e declaração INTENT<br />

No programa bascara1, (programa <strong>8.</strong>1) as variáveis mudas a0, a1 e a2 foram utilizadas para transferir à<br />

subrotina informação acerca dos coeficientes do polinômio de 2 grau. Por isto, estes nomes foram declarados<br />

ter a intenção INTENT(IN). Por outro lado, a subrotina devolveu ao programa os valores das raízes reais (caso<br />

existam) através das variáveis mudas r1 e r2, as quais foram declaradas ter a intenção INTENT(OUT). Uma<br />

terceira possibilidade seria a existência de uma variável cujo valor é inicialmente transferido para dentro da<br />

subrotina, modificado por esta e, então transferido para fora da subrotina. Neste caso, esta variável deveria<br />

ser declarada com a intenção INTENT(INOUT).<br />

Se uma variável muda é especificada com atributo INTENT(IN), o seu valor não pode ser alterado pela rotina,<br />

seja através de atribuição de valor a partir de uma expressão, ou através de sua transferência para uma outra<br />

rotina que, por sua vez, alteraria este valor.<br />

Se a variável é especificada com INTENT(OUT), o seu valor é indefinido na chamada da rotina, sendo este<br />

então definido durante a execução da mesma e finalmente transferido à unidade que chamou a rotina.<br />

Se a variável é especificada com INTENT(INOUT), esta tem o seu valor inicial transferido na chamada da<br />

rotina, o valor pode ser alterado e, então, o novo valor pode ser devolvido à unidade que chamou a rotina.<br />

É recomendado que a intenção de todas as variáveis mudas seja declarada. Em funções, variáveis mudas<br />

somente podem ser declaradas com INTENT(IN).<br />

Como alternativa ao uso do atributo INTENT(INOUT), pode-se declarar a intenção de nomes de argumentos<br />

mudos de rotinas, que não sejam sub-programas mudos, através da declaração INTENT(INOUT), a qual tem a<br />

forma geral:<br />

INTENT() [::] <br />

Por exemplo,<br />

SUBROUTINE SOLVE(A, B, C, X, Y, Z)<br />

REAL :: A, B, C, X, Y, Z<br />

INTENT(IN) :: A, 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!