Interfaces Explicitas para Subprogramas

Uma interface de subprograma são todas as características de um subprograma que são de interesse do processador Fortran quando um subprograma é ativado. Estas características incluem o nome do subprograma, o número, ordem, tipo de parâmetros, forma, propósito dos argumentos; se os argumentos são opcionais, e o tipo de resultado, no caso de função.

A interface pode ser explícita no caso em que o processador Fortran tem que acessar todas as características da interface do subprograma, ou implícita, quando o processador Fortran tem que assumir suposições sobre a interface.

Interfaces Explícitas

É desejável para evitar erros, criar interfaces explícitas sempre que possível. O compilador Essential Lahey Fortran (ELF90) exige sempre que se defina uma interface explicita para cada subprograma utilizado. Uma interface explicita é uma descrição do nome do subprograma, dos parâmetros, dos argumentos utilizados e dos resultados, no caso de função. Os parâmetros são variáveis especiais que recebem os dados necessários para a execução do subprograma. Os argumentos são valores enviados a partir do módulo que ativa o subprograma e que são recebidos nos subprogramas pelos parâmetros.

Sintaxe da interface:

INTERFACE

[corpo da interface] ...

END INTERFACE

Onde:

corpo da interface é

FUNCTION

[parte da especificação]

END FUNCTION

ou

SUBROUTINE

[parte de aspecificação]

END SUBROUTINE

parte da especificção é a parte da especificação do subprograma...Interface do subprograma

Exemplo:

interface

    subroutine x(a, b, c)

        implicit none

        real, intent(in), dimension (2,8) :: a

        real, intent(out), dimension (2,8) :: b, c

    end subroutine x

    function y(a, b)

        implicit none

        logical, intent (in) :: a, b

    end function y

end interface

Neste exemplo, interfaces explícitas são fornecidas para os subprogramas x e y. Qualquer erro referenciando estes subprogramas no escopo desta unidade de bloco de interface será diagnosticado em tempo de compilação.

Na especificação de cada argumento de subprograma é inserido o intento (intent)  que diz ao processador Fortran se estes valores estão entrando (in), saindo (out), ou, entrando e saindo (in out) do subprograma.

Mais Exemplos

1)      Programa para somar matrizes inteiras com dimensões máximas 10x10:

! Programa principal

PROGRAM matriz

    IMPLICIT NONE

    INTERFACE

        SUBROUTINE lemat(mat, lin, col)

            IMPLICIT NONE

            INTEGER, INTENT (IN OUT) :: mat(10, 10)

            INTEGER, INTENT (IN) :: lin

            INTEGER, INTENT (IN) :: col

        END SUBROUTINE lemat

        SUBROUTINE impmat(mat, lin, col)

            IMPLICIT NONE

            INTEGER, INTENT (IN) :: mat(10, 10)

            INTEGER, INTENT (IN) :: lin

            INTEGER, INTENT (IN) :: col

        END SUBROUTINE impmat

    END INTERFACE

 

    INTEGER :: mat1(10, 10), mat2(10, 10), matS(10, 10), lin, col

    INTEGER :: indl, indc

 

    WRITE(*,*)"Informe o numero de linhas e colunas das matrizes:"

    READ(*,*)lin, col

    WRITE(*,*)"Informe os dados para a primeira matriz a somar:"

    CALL lemat(mat1, lin, col)

    WRITE(*,*)"Informe os dados para a segunda matriz a somar:"

    CALL lemat(mat1, lin, col)

    ! Soma das matrizes

    DO indl = 1, lin, 1

        DO indc = 1, col, 1

            matS(indl, indc) = mat1(indl, indc) + mat2(indl, indc)

        END DO

    END DO

! Impressão das matrizes

    CALL impmat(mat1, lin, col)

    CALL impmat(mat2, lin, col)

    CALL impmat(matS, lin, col)

    STOP

END PROGRAM matriz

! Subrotina lemat

SUBROUTINE lemat(mat, lin, col)

    IMPLICIT NONE

    INTEGER, INTENT (IN OUT) :: mat(10, 10)

    INTEGER, INTENT (IN) :: lin

    INTEGER, INTENT (IN) :: col

   

    INTEGER :: l, c

   

    DO l = 1, lin, 1

        DO c = 1, col, 1

            READ(*,*)mat(l, c)

        END DO

    END DO

    RETURN

END SUBROUTINE lemat

! Subrotina impmat

SUBROUTINE impmat(mat, lin, col)

    IMPLICIT NONE

    INTEGER, INTENT (IN) :: mat(10, 10)

    INTEGER, INTENT (IN) :: lin

    INTEGER, INTENT (IN) :: col

    INTEGER :: l, c

   

    DO l = 1, lin, 1

        WRITE(*,*) "Linha: ", l

        DO c = 1, col, 1

            WRITE(*,*)mat(l, c)

        END DO

    END DO

    RETURN

END SUBROUTINE impmat

2)      Programa para calcular a soma dos fatoriais de dois números inteiros usando uma função:

! Programa principal

PROGRAM calculaFatorial

    IMPLICIT NONE

    INTERFACE

        FUNCTION fat(inteiro)

            IMPLICIT NONE

            INTEGER, INTENT (IN) :: inteiro

            INTEGER :: fat

        END FUNCTION fat

     END INTERFACE

 

    INTEGER :: numero1, numero2

 

    WRITE(*,*)"Informe os numeros para o calculo da soma dos o fatoriais: "

    READ(*,*) numero1, numero2

    WRITE(*,*)"O valor da soma dos o fatoriais é : ", fat(numero1) + fat(numero2)

    STOP

END PROGRAM calculaFatorial

! Funçao para cálculo do fatorial de um inteiro

FUNCTION fat (inteiro)

    IMPLICIT NONE

    INTEGER, INTENT (IN) :: inteiro

 

    INTEGER :: fat

    INTEGER :: fatorial, fator

 

    fatorial = 1

    DO fator = 1, inteiro

        fatorial = fatorial * fator

    END DO

    fat = fatorial

    RETURN

END FUNCTION fat

3)      Programa para ler dois inteiros fazendo uma comparação de valores entre eles, utilizando uma função comparadora:

! Programa principal

PROGRAM comparaInteiros

    IMPLICIT NONE

    INTERFACE

        FUNCTION comparaInt(valor1, valor2)

            IMPLICIT NONE

            INTEGER, INTENT (IN) :: valor1

            INTEGER, INTENT (IN) :: valor2

            INTEGER :: comparaInt

        END FUNCTION comparaInt

    END INTERFACE

 

    INTEGER :: numero1, numero2, retorno

 

    WRITE (*,*) "Informe os numeros para serem comparados: "

    READ (*,*) numero1, numero2

    retorno = comparaInt(numero1, numero2)

    IF (retorno .EQ. -1) THEN

        WRITE (*,*) "O primeiro ", numero1, " é menor que o segundo ", numero2

    ELSE IF (retorno .EQ. 0) THEN

        WRITE (*,*) "O primeiro ", numero1, " é igual ao segundo ", numero2

    ELSE

        WRITE (*,*) "O primeiro ", numero1, " é maior que o segundo ", numero2

    END IF

    STOP

END PROGRAM comparaInteiros

! Funçao para comparar numeros inteiros

FUNCTION comparaInt (inteiro1, inteiro2)

    IMPLICIT NONE

    INTEGER, INTENT (IN) :: inteiro1

    INTEGER, INTENT (IN) :: inteiro2

    INTEGER :: comparaInt

 

    IF (inteiro1 .LT. inteiro2) THEN

        comparaInt = -1

    ELSE IF (inteiro1 .EQ. inteiro2) THEN

        comparaInt = 0

    ELSE

        comparaInt = 1

    END IF

    RETURN

END FUNCTION comparaInt