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.

100 <strong>8.</strong>2. sub-programas<br />

! Calcula o mínimo de FUNC no intervalo [A,B].<br />

REAL :: MINIMO<br />

REAL, INTENT(IN) :: A, B<br />

INTERFACE<br />

FUNCTION FUNC(X)<br />

REAL :: FUNC<br />

REAL, INTENT(IN) :: X<br />

END FUNCTION FUNC<br />

END INTERFACE<br />

REAL :: F,X<br />

...<br />

F= FUNC(X) !Invocaç~ao da funç~ao.<br />

...<br />

END FUNCTION MINIMO<br />

Note o uso de um bloco de interface para indicar ao compilador que o nome FUNC corresponde a uma função<br />

definida pelo usuário.<br />

Em Fortran 77, como não havia o recurso de blocos de interface, a indicação que o nome FUNC corresponde a<br />

uma função externa é realizada através da declaração EXTERNAL. Assim, no exemplo acima, no lugar da interface<br />

apareceria:<br />

...<br />

REAL FUNC<br />

EXTERNAL FUNC<br />

...<br />

para indicar a função externa. A mesma alternativa continua válida em Fortran 90/95, onde, além da declaração,<br />

pode-se usar também a palavra-chave EXTERNAL como atributo de um nome. Contudo, como já foi mencionado<br />

na seção <strong>8.</strong>2.7, o simples uso da declaração ou atributo EXTERNAL não possibilita o controle nos argumentos<br />

desta função, ao contrário do que ocorre quando a interface é explícita.<br />

Um exemplo de programa que chama a função MINIMO seria o seguinte:<br />

PROGRAM MIN<br />

IMPLICIT NONE<br />

REAL :: MENOR<br />

INTERFACE<br />

FUNCTION FUN(X)<br />

REAL :: FUN<br />

REAL, INTENT(IN) :: X<br />

END FUNCTION FUN<br />

END INTERFACE<br />

...<br />

MENOR= MINIMO(1.0, 2.0, FUN)<br />

...<br />

END PROGRAM MIN<br />

O uso de um bloco de interface não é necessário se a interface de FUN for explícita, como no caso de uma rotina<br />

de módulo.<br />

No exemplo acima, a função FUN não pode ser interna, porque estas não são admitidas quando os seus nomes<br />

são usados como argumentos de outras rotinas. Ou seja, somente rotinas externas ou de módulos são aceitas<br />

quando os seus nomes são transferidos a outras rotinas como argumentos.<br />

O programa-exemplo das páginas 101 e 102 descreve uma subrotina que gera uma matriz de pontos a partir<br />

de uma função fornecida pelo programador.<br />

<strong>8.</strong>2.13 <strong>Funções</strong> de valor matricial<br />

<strong>Funções</strong>, além de fornecer os resultados usuais na forma de valores dos tipos intrínsecos inteiro, real, complexo,<br />

lógico e de caractere, podem também fornecer como resultado valores de tipo derivado, matrizes e ponteiros.<br />

No caso de funções de valor matricial, o tamanho do resultado pode ser determinado de forma semelhante<br />

à maneira como matrizes automáticas são declaradas.<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!