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.

PROGRAM TESTA_MATRIZ<br />

IMPLICIT NONE<br />

REAL, DIMENSION(0:10, 0:20) :: A<br />

...<br />

CALL SUB_MATRIZ(A)<br />

...<br />

CONTAINS<br />

SUBROUTINE SUB_MATRIZ(DA)<br />

REAL, DIMENSION(:,:), INTENT(INOUT) :: DA<br />

...<br />

END SUBROUTINE SUB_MATRIZ<br />

END PROGRAM TESTA_MATRIZ<br />

<strong>Capítulo</strong> <strong>8.</strong> Sub-Programas e Módulos 97<br />

A subrotina SUB_MATRIZ declara a matriz de forma assumida DA. A correspondência entre os elementos da<br />

matriz real A e a matriz muda DA é: A(0,0)↔DA(1,1) . . . A(I,J)↔DA(I+1,J+1) . . . A(10,20)↔DA(11,21).<br />

Para que houvesse a mesma correspondência entre os elemento de A e DA, seria necessário declarar esta última<br />

como:<br />

REAL, DIMENSION(0:,0:), INTENT(INOUT) :: DA<br />

Neste caso, a correspondência seria a desejada: A(0,0)↔DA(0,0) . . . A(I,J)↔DA(I,J) . . . A(10,20)↔DA(10,20).<br />

Para se definir matrizes de forma assumida, é necessário que a interface seja explícita na unidade que chama<br />

a rotina. A matriz real pode ter sido declarada, na unidade que chama a rotina ou em outra unidade anterior,<br />

como uma matriz alocável. Como exemplo, considere a seguinte rotina externa, seguida do programa que a<br />

chama, programa <strong>8.</strong>2, listado na página 98:<br />

subroutine sub ( ra , rb , rc , max a )<br />

implicit none<br />

real , dimension ( : , : ) , intent ( in ) : : ra , rb<br />

real , dimension ( : , : ) , intent ( out ) : : rc<br />

real , intent ( out ) : : max a<br />

!<br />

max a= maxval ( ra )<br />

rc= 0.5 rb<br />

return<br />

end subroutine sub<br />

Objetos automáticos<br />

Uma rotina com argumentos mudos que são matrizes cujos tamanhos variam de uma chamada a outra pode<br />

também precisar de matrizes locais (não mudas) cujos tamanhos variem ao sabor dos tamanhos das matrizes<br />

mudas. Um exemplo simples é a matriz TEMP na subrotina abaixo, destinada a trocar os elementos entre duas<br />

matrizes:<br />

SUBROUTINE TROCA(A,B)<br />

IMPLICIT NONE<br />

REAL, DIMENSION(:), INTENT(INOUT) :: A, B<br />

REAL, DIMENSION(SIZE(A)) :: TEMP !A funç~ao SIZE fornece o tamanho de TEMP.<br />

TEMP= A<br />

A= B<br />

B= TEMP<br />

RETURN<br />

END SUBROUTINE TROCA<br />

Matrizes como a TEMP, cujas extensões variam da maneira apresentada são chamadas matrizes automáticas e<br />

são exemplos de objetos automáticos de dados. Estes são objetos de dados cujas declarações dependem do valor<br />

de expressões não-constantes e que não são argumentos mudos de rotinas.<br />

Um outro objeto automático, relacionado com variáveis de caracteres, surge através do comprimento variável<br />

de um caractere:<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!