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

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

110 <strong>8.</strong>3. Módulos<br />

<strong>8.</strong>3.1 Dados globais<br />

Em Fortran, variáveis são usualmente entidades locais. Contudo, em muitas situações é necessário que alguns<br />

objetos tenham o seu valor compartilhado entre diferentes unidades de programa. A maneira mais usual de se<br />

realizar este compartilhamento é através da lista de argumentos de uma rotina. Entretanto, facilmente surge<br />

uma situação onde uma variável não pode ser compartilhada como argumento de um sub-programa. Neste<br />

momento, é necessária uma outra estratégia para se definir dados globais. Esta necessidade já era corriqueira<br />

no Fortran 77.<br />

Fortran 77<br />

A maneira mais usada no Fortran 77 para compartilhar dados globais é através de blocos common. Um<br />

bloco common é uma lista de variáveis armazenadas em uma área da memória do computador que é identificada<br />

através de um nome e que pode ser acessada diretamente em mais de uma unidade de programa.<br />

A necessidade de se criar um bloco common surge, muitas vezes, com o uso de rotinas de bibliotecas de<br />

aplicação generalizada, as quais são definidas com um conjunto restrito de argumentos. Muitas vezes, faz-se<br />

necessário transferir informação entre estas rotinas ou entre rotinas que usam as bibliotecas de maneira não<br />

prevista na lista de argumentos.<br />

Por exemplo, seja a subrotina INTEG, a qual realiza a integração numérica unidimensional de uma função<br />

F(x) qualquer, no intervalo (A,B):<br />

SUBROUTINE INTEG(F,A,B,RES)<br />

REAL*8 A, B, F, RES, TEMP<br />

EXTERNAL F<br />

...<br />

TEMP= F(X)<br />

...<br />

RES= <br />

END SUBROUTINE INTEG<br />

Caso o programador queira integrar a função g(x) = cos(αx) no intervalo [0, 1], ele não poderá informar ao<br />

integrador o valor de α na lista de argumentos da subrotina INTEG. A solução está no uso de um bloco common:<br />

REAL*8 FUNCTION G(X)<br />

REAL*8 X, ALFA<br />

COMMON /VAR/ ALFA<br />

G= COS(ALFA*X)<br />

RETURN<br />

END FUNCTION G<br />

onde VAR é o nome que identifica o espaço de memória onde o valor de ALFA será armazenado. Assim, o programa<br />

pode realizar a integração usando o mesmo bloco common:<br />

C<br />

C<br />

PROGRAM INTEGRA<br />

REAL*8 G, A, INT<br />

EXTERNAL G<br />

COMMON /VAR/ A<br />

...<br />

PRINT*, ’Entre com o valor de alfa:’<br />

READ(*,*) A<br />

CALL INTEG(G,0.0D0,1.0D0,INT)<br />

...<br />

END PROGRAM INTEGRA<br />

Note que o bloco VAR aparece tanto no programa quanto na função; porém não há necessidade de ele aparecer<br />

na subrotina INTEG.<br />

A forma geral de um bloco common é:<br />

COMMON // <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!