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.

<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

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

Saved successfully!

Ooh no, something went wrong!