Capítulo 8. Funções e Subrotinas - UFMG
Capítulo 8. Funções e Subrotinas - UFMG
Capítulo 8. Funções e Subrotinas - UFMG
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