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.
É 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.
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