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.
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