Capítulo 8. Funções e Subrotinas - UFMG
Capítulo 8. Funções e Subrotinas - UFMG
Capítulo 8. Funções e Subrotinas - UFMG
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