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 99<br />
ocorre quando variáveis globais públicas declaradas no corpo de um módulo são disponibilizadas à rotina através<br />
da instrução USE; enquanto que associação ao hospedeiro ocorre quando variáveis declaradas em uma unidade<br />
de programa são disponibilizadas às suas rotinas internas.<br />
Matrizes automáticas são automaticamente criadas (alocadas) na entrada da rotina e automaticamente<br />
dealocadas na saída. Assim, o tamanho das matrizes automáticas pode variar em diferentes chamadas da rotina.<br />
Note que não há mecanismo para verificar a disponibilidade de memória para a criação de matrizes automáticas.<br />
Caso não haja memória suficiente, o programa é interrompido. Além disso, uma matriz automática não pode<br />
aparecer em uma declaração SAVE (seção <strong>8.</strong>2.15) ou NAMELIST, ou possuir o atributo SAVE na sua declaração.<br />
Além disso, a matriz não pode ser inicializada na sua declaração.<br />
O seguinte programa-exemplo usa matrizes alocáveis, de forma assumida e automáticas:<br />
subroutine sub mat ( a , r e s )<br />
implicit none<br />
real , dimension ( : , : ) , intent ( in ) : : a ! Matriz de forma assumida<br />
real , intent ( out ) : : r e s<br />
real , dimension ( size ( a , 1 ) , size ( a , 2 ) ) : : temp ! Matriz automática<br />
!<br />
temp= s i n ( a )<br />
r e s= minval ( a+temp )<br />
return<br />
end subroutine sub mat<br />
program matriz aut<br />
implicit none<br />
real , dimension ( : , : ) , allocatable : : a<br />
real : : r e s<br />
integer : : n , m, i<br />
INTERFACE<br />
subroutine sub mat ( a , r e s )<br />
real , dimension ( : , : ) , intent ( in ) : : a<br />
real , intent ( out ) : : r e s<br />
real , dimension ( size ( a , 1 ) , size ( a , 2 ) ) : : temp<br />
end subroutine sub mat<br />
END INTERFACE<br />
print , ”Entre com dimensões da matriz : ”<br />
read , n ,m<br />
allocate ( a (n ,m) )<br />
a= reshape ( source =(/( tan ( real ( i ) ) , i= 1 , nm) / ) , shape= (/n ,m/ ) )<br />
print , ”Matriz a : ”<br />
do i= 1 , n<br />
print , a ( i , : )<br />
end do<br />
c a l l sub mat ( a , r e s )<br />
print , ””<br />
print , ”O menor v a l o r de a + s i n ( a ) é : ” , r e s<br />
end program matriz aut<br />
<strong>8.</strong>2.12 sub-programas como argumentos de rotinas<br />
Até este ponto, os argumentos de uma rotina forma supostos ser variáveis ou expressões. Contudo, uma<br />
outra possibilidade é um ou mais argumentos sendo nomes de outras rotinas que serão invocadas. Um exemplo<br />
de situação onde é necessário mencionar o nome de uma rotina como argumento de outra é quando a segunda<br />
executa a integração numérica da primeira. Desta forma, é possível escrever-se um integrador numérico genérico,<br />
que integra qualquer função que satisfaça a interface imposta a ela.<br />
Um exemplo de uso do nome de uma rotina como argumento ocorre abaixo. a função MINIMO calcula o<br />
mínimo (menor valor) da função FUNC em um intervalo:<br />
FUNCTION MINIMO(A, B, FUNC)<br />
Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008