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.
94 <strong>8.</strong>2. sub-programas<br />
INTERFACE<br />
FUNCTION AREA(INICIO, FINAL, TOL)<br />
REAL :: AREA<br />
REAL, INTENT(IN), OPTIONAL :: INICIO, FINAL, TOL<br />
END FUNCTION AREA<br />
END INTERFACE<br />
<strong>8.</strong>2.10 Tipos derivados como argumentos de rotinas<br />
Argumentos de rotinas podem ser do tipo derivado se este está definido em somente uma única unidade de<br />
programa. Isto pode ser obtido de duas maneiras:<br />
1. A rotina é interna à unidade de programa na qual o tipo derivado é definido.<br />
2. O tipo derivado é definido em um módulo o qual é acessado pela rotina.<br />
<strong>8.</strong>2.11 Matrizes como argumentos de rotinas<br />
Um outro recurso importante em Fortran é a capacidade de usar matrizes como argumentos mudos de<br />
sub-programas. Se um argumento mudo de uma rotina é uma matriz, então o argumento real pode ser:<br />
o nome da matriz (sem subscritos);<br />
um elemento de matriz.<br />
A primeira forma transfere a matriz inteira; a segunda forma, a qual transfere somente uma seção que inicia no<br />
elemento especificado, é descrita em mais detalhes a seguir.<br />
<strong>8.</strong>2.11.1 Matrizes como argumentos em Fortran 77<br />
O Fortran 77 já possuía diversos recursos para realizar a transferência de matrizes entre sub-programas.<br />
Estes recursos foram posteriormente estendidos com a definição do novo padrão com o Fortran 90/95.<br />
O uso mais simples e comum de argumentos mudos matriciais consiste em tornar disponível o conteúdo<br />
completo de uma matriz em uma rotina. Se as matrizes usadas como argumentos reais serão todas do mesmo<br />
tamanho, então as matrizes mudas na rotina podem usar limites fixos (alocação estática). Por exemplo:<br />
SUBROUTINE PROD(X, Y, Z)<br />
C Calcula o produto dos vetores X e Y, com 100 elementos cada,<br />
C resultando no vetor Z do mesmo tamanho.<br />
REAL X(100), Y(100), Z(100)<br />
DO 10, I= 1,100<br />
Z(I)= X(I)*Y(I)<br />
15 CONTINUE<br />
END<br />
Esta subrotina pode ser chamada por um programa semelhante a este:<br />
PROGRAM CHAMA_PROD<br />
REAL A(100), B(100), C(100)<br />
READ(UNIT=*, FMT=*) A,B<br />
CALL PROD(A, B, C)<br />
WRITE(UNIT=*, FMT=*)C<br />
END<br />
Este uso de matrizes como argumentos mudos de sub-programas é perfeitamente legítimo, porém inflexível,<br />
porque não permite o uso de matrizes de qualquer outro tamanho. Para possibilitar uma flexibilidade maior,<br />
o Fortran 77 introduziu dois mecanismos que possibilitaram uma alocação dinâmica no tamanho de matrizes<br />
usadas como argumentos mudos de sub-programas. Estes mecanismos são as matrizes ajustáveis e as matrizes<br />
de tamanho assumido. A alocação dinâmica, entretanto, é parcial, porque as matrizes reais transferidas aos<br />
sub-programas deveriam ter seu tamanho definido por alocação estática em algum ponto dentro das unidades<br />
de programas que chamavam as rotinas.<br />
Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008