FORTRAN 90 Denise Yumi Takamura SUBPROGRAMAS Um subprograma é uma unidade de programa independente. Sua execução é subordinada ao programa principal ou a uma outra unidade de programa. A linguagem FORTRAN 90 permite dois tipos de subprogramas: FUNÇÕES E SUB-ROTINAS. FUNÇÕES Uma função é um procedimento que resulta em um número, valor lógico, string ou array. A função é chamada pelo nome de uma expressão. Sua execução começa no topo da função e termina quando há a declaração RETURN ou um END FUNCTION. . SUB-ROTINAS Sub-rotina não retorna necessariamente apenas um valor, como no caso das funções; nenhum valor é associado a sub-rotina. SUBROUTINE nome (lista de parâmetros) Para chamar a sub-rotina, usa-se o comando CALL. CALL nome (lista de parâmetros) Para retornar a sub-rotina usa-se a declaração END SUBROUTINE. Ex: Subroutine hipotenusa DUMMY ARGUMENTS A lista de argumentos pode conter variáveis, arrays ou ambos que são passados pela chamada do programa para a sub- rotina. Estas variáveis são chamadas “dummy arguments” desde que a sub-rotina não aloque nenhuma memória para elas. PASSAGEM POR REFERÊNCIA Nessa implementação, em vez de transmitir valores de dados, ela transmite um caminho de acesso, usualmente apenas um endereço, para o subprograma chamado. Ex: Program bad_call PROGRAM bad_call IMPLICIT NONE REAL :: x=1 CALL bad_argument(x) END PROGRAM SUBROUTINE bad_argument (i) IMPLICIT NONE INTEGER ::i = 0 WRITE(*,*),' I= ', i END SUBROUTINE PASSAGEM POR ARRAYS Se o parâmetro for um arranjo, então o ponteiro aponta para o 1º valor no array. Porém a subrotina precisa saber o local e o tamanho do array para garantir que ele fique dentro do limite do array e da execução das operações. Ex: Program array PROGRAM array IMPLICIT NONE INTEGER :: i REAL, DIMENSION (5) :: a =0 CALL sub (a, 5, 6) DO i = 1,6 WRITE(*,100) i, a(i) 100 FORMAT(1X,'A(',I1,') = ', F6.2) END DO END PROGRAM SUBROUTINE sub (a, ndim, n) IMPLICIT NONE INTEGER, INTENT(IN) :: ndim REAL, INTENT(OUT), DIMENSION(ndim) :: a INTEGER, INTENT(IN) :: n INTEGER :: i, j = 0 DO i = 1, n j = j + (2 * i) a(i) = j j = j +3 END DO END SUBROUTINE sub PASSAGEM DE VARIÁVEIS Quando uma variável caracter é usada como “dummy argument” o seu tamanho é declarado com um asterisco. Ex: exemplo (string) CHARACTER (len=*), INTENT (IN):: string MÓDULOS A estrutura de um módulo é quase idêntica a estrutura de um programa. São utilizados no caso de existirem parâmetros, variáveis e subprogramas que devem ser divididos por muitas unidades de programas. MÓDULOS - continuação O módulo não contém declarações para serem executadas no programa. Nele só pode conter declarações e funções para serem usados em outros módulos e programas. Portanto, um módulo não pode existir sozinho, ele deve ser usado com outros módulos e um programa principal. Ex: MODULE SumAverage CONTAINS REAL FUNCTION Sum(a, b, c) IMPLICIT NONE REAL, INTENT(IN) :: a, b, c Sum = a + b + c END FUNCTION Sum REAL FUNCTION Average(a, b, c) IMPLICIT NONE REAL, INTENT(IN) :: a, b, c Average = Sum(a,b,c)/2.0 END FUNCTION Average END MODULE SumAverage RECURSIVIDADE FORTRAN permite que funções e sub-rotinas sejam declaradas recursivamente. A sub-rotina é declarada recursivamente adicionando a palavra RECURSIVE na declaração da SUBROUTINE. RECURSIVIDADE- continuação Pode-se definir funções recursivas também. FORTRAN permite especificar dois diferentes nomes, um para chamar uma função recursiva e outro para retornar um resultado. Ex: program fatorial PROGRAM fatorial IMPLICIT NONE INTEGER :: i WRITE(*,*) " Este programa calcula fatorial" WRITE(*,*) "Entre com um numero positivo: " READ(*,*) i WRITE(*,*) " O fatorial e: ", fat(i) contains RECURSIVE INTEGER FUNCTION fat(n) result(F) INTEGER n IF(n==0) THEN F = 1 ELSE F = n*fat(n-1) END IF END function fat end program fatorial BIBLIOGRAFIA • FORTRAN 90/95 for Scientists and EngineersStephen J. Chapman • FORTRAN 90 – Loren P.Meissner • Introdução ao FORTRAN 77 para microcomputadores - Ronaldo L.D. Cereda e José Carlos Maldonado