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 93<br />

C= AREA(0.0, TOL= 1.0E-5, 100.0) ! N~ao é válido.<br />

O exemplo acima não é válido porque tentou-se transferir o valor 100.0 sem haver a informação da palavra-chave.<br />

Uma vez que o compilador não será capaz de realizar as associações apropriadas exceto se este conhecer as<br />

palavras-chave (nomes dos argumentos mudos), a interface do sub-programa deve ser explícita caso palavraschave<br />

sejam utilizadas. No caso de rotinas internas ou rotinas de módulo, a interface já é explícita. No caso de<br />

rotinas externas, faz-se necessário o uso de um bloco de interfaces.<br />

<strong>8.</strong>2.9 Argumentos opcionais<br />

Em algumas situações, nem todos os argumentos de um sub-programa necessitam ser transferidos durante<br />

uma chamada do mesmo. Um argumento que não necessita ser transferido em todas as chamadas possíveis<br />

de um sub-programa é denominado opcional. Estes argumentos opcionais podem ser declarados pelo atributo<br />

OPTIONAL na declaração do tipo de variáveis.<br />

Mantendo o exemplo da função AREA acima, a seguinte definição pode ser feita:<br />

...<br />

CONTAINS<br />

FUNCTION AREA(INICIO, FINAL, TOL)<br />

REAL :: AREA<br />

REAL, INTENT(IN), OPTIONAL :: INICIO, FINAL, TOL<br />

...<br />

END FUNCTION AREA<br />

a qual agora tem as seguintes chamadas válidas, entre outras:<br />

A= AREA(0.0, 100.0, 1.0E-2)<br />

B= AREA(INICIO= 0.0, FINAL= 100.0, TOL= 1.0E-2)<br />

C= AREA(0.0)<br />

D= AREA(0.0, TOL= 1.0E-2)<br />

onde se fez uso tanto da associação posicional para os valores dos argumentos, quanto da associação via o uso<br />

de palavras-chave.<br />

Um argumento obrigatório (que não é declarado opcional) deve aparecer exatamente uma vez na lista de<br />

argumentos da chamada de uma rotina, ou na ordem posicional ou na lista de palavras-chave. Já um argumento<br />

opcional pode aparecer, no máximo uma vez, ou na lista posicional de argumentos ou na lista de palavras-chave.<br />

Da mesma forma como na seção <strong>8.</strong>2.8, a lista de palavras-chave pode aparecer em qualquer ordem; porém,<br />

depois que o primeiro argumento é transferido via uma palavra-chave, todos os restantes, obrigatórios ou<br />

opcionais, devem ser transferidos da mesma forma.<br />

A rotina necessita de algum mecanismo para detectar se um argumento opcional foi transferido na sua<br />

chamada, para que esta possa tomar a medida adequada no caso de presença ou de ausência. Este mecanismo é<br />

fornecido pela função intrínseca PRESENT (seção 7.3). Por exemplo, na função AREA acima, pode ser necessário<br />

verificar a existência da variável TOL para definir a tolerância do cálculo ou usar um valor padrão caso ela não<br />

tenha sido transferida:<br />

...<br />

REAL :: TTOL<br />

...<br />

IF(PRESENT(TOL))THEN<br />

TTOL= TOL<br />

ELSE<br />

TTOL= 1.0E-3<br />

END IF<br />

...<br />

A variável TTOL é utilizada aqui porque ela pode ser redefinida, ao passo que a variável TOL não, uma vez que<br />

ela foi declarada com INTENT(IN).<br />

Como no caso dos argumento com palavras-chave, se a rotina é externa e possui algum argumento opcional,<br />

um bloco de interface deve ser fornecido em algum momento. Este não é o caso da função AREA, uma vez que<br />

ela é interna. Contudo se externa ela o fosse, dever-se-ia declarar o seguinte bloco de interface:<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!