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.
<strong>Capítulo</strong> <strong>8.</strong> Sub-Programas e Módulos 111<br />
onde é qualquer nome válido em Fortran e é uma lista de variáveis que<br />
podem ser escalares, elementos de matrizes, seções de matrizes ou matrizes completas. Neste último caso,<br />
somente se utiliza o nome da matriz. É claro que a informação acerca da natureza e tipo das variáveis listadas<br />
no bloco common deve ser fornecida por declarações adequadas de variáveis.<br />
A grande desvantagem desta forma descentralizada de definir-se dados globais está no fato de que em todas<br />
as unidades de programa que utilizam um dado bloco common, as variáveis listadas nele devem concordar em<br />
número, ordem, natureza e tipo. Caso o programador esteja desenvolvendo um código complexo, composto por<br />
um número grande de unidades que usam o mesmo bloco common, e ele sinta a necessidade de alterar de alguma<br />
forma a lista de variáveis em uma determinada unidade, ele deverá buscar em todas unidades restantes que fazem<br />
referência ao mesmo bloco e realizar a mesma alteração; caso contrário, mesmo que o programa compile e linke<br />
sem erro, é quase certo que as variáveis serão compartilhadas de forma incoerente entre as diferentes unidade de<br />
programa e este acabe gerando resultados incorretos. É fácil perceber que este controle torna-se sucessivamente<br />
mais difícil à medida que a complexidade do programa aumenta.<br />
Os blocos common são ainda aceitos em Fortran 90/95; porém, o seu uso não é recomendado, pela razão<br />
exposta acima.<br />
Fortran 90/95<br />
O uso de um módulo fornece um mecanismo centralizado de definição de objetos globais. Por exemplo,<br />
suponha que se queira ter acesso às variáveis inteiras I, J e K e às variáveis reais A, B e C em diferentes unidades<br />
de programa. Um módulo que permitira o compartilhamento destas variáveis é o seguinte:<br />
MODULE GLOBAIS<br />
IMPLICIT NONE<br />
INTEGER :: I, J, K<br />
REAL :: A, B, C<br />
END MODULE GLOBAIS<br />
Estas variáveis se tornam acessíveis a outras unidades de programa (inclusive outros módulos) através da<br />
instrução USE, isto é:<br />
USE GLOBAIS<br />
A instrução USE é não executável e deve ser inserida logo após o cabeçalho da unidade de programa (PROGRAM,<br />
FUNCTION, SUBROUTINE ou MODULE) e antes de qualquer outra instrução não executável, tal como uma declaração<br />
de variáveis. Uma unidade de programa pode invocar um número arbitrário de módulos usando uma série de<br />
instruções USE. Um módulo pode usar outros módulos, porém um módulo não pode usar a si próprio, seja de<br />
forma direta ou indireta.<br />
Assim, o módulo GLOBAIS pode ser usado da seguinte forma:<br />
FUNCTION USA_MOD(X)<br />
USE GLOBAIS<br />
IMPLICIT NONE<br />
REAL :: USA_MOD<br />
REAL, INTENT(IN) :: X<br />
USA_MOD= I*A - J*B + K*C - X<br />
RETURN<br />
END FUNCTION USA_MOD<br />
O vantagem de um módulo sobre um bloco COMMON para compartilhar objetos globais é evidente. A definição<br />
dos nomes, tipos e espécies das variáveis é realizada em uma única unidade de programa, a qual é simplesmente<br />
usada por outras, estabelecendo assim um controle centralizado sobre os objetos.<br />
O uso de variáveis de um módulo pode causar problemas se o mesmo nome é usado para diferentes variáveis<br />
em partes diferentes de um programa. A declaração USE pode evitar este problema ao permitir a especificação<br />
de um nome local distinto daquele definido no módulo, porém que ainda permita o acesso aos dados globais.<br />
Por exemplo,<br />
...<br />
USE GLOBAIS, R => A, S => B<br />
...<br />
USA_MOD= I*R - J*S + K*C - X<br />
...<br />
Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008