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 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

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

Saved successfully!

Ooh no, something went wrong!