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.

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

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

Saved successfully!

Ooh no, something went wrong!