As sub-rotinas também seguem as idéias dos subprogramas que permitem calcular alguma expressão fora do programa principal. As diferenças básicas das funções e das sub-rotinas são a forma de chamada dentro do programa principal e como elas retornam os valores.
Quando desejamos obter um valor de uma função intrínseca ou uma função particular do programador, chamamos a função (que é uma variável) e ela mesma nos retorna um valor.
A utilização de uma sub-rotina consiste inicialmente na chamada que é feita pelo comando call, por exemplo call subroutine pitagoras(ca,co,hip), em que pitagoras é o nome da subrotina e os argumentos ca e co são os valores de entrada e hip são os valores de saída da subrotina.
Note que em uma sub-rotina o nome não retorna o valor e sim uma ou algumas variáveis que estão no argumento que acompanha o nome da subrotina. Em uma function o próprio nome, que é uma variável, é quem retorna algum valor.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! PROGRAMA PARA EXEMPLIFICAR UMA SUBROTINA !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! program prog_sub_1 implicit none ! real(kind=4) :: ca, co, hip ! write(*,*)'---> Triangulo Retangulo <---' write(*,*)'Digite o tamanho do cateto adjacente:' read(*,*) ca write(*,*)'Digite o tamanho do cateto oposto:' read(*,*) co ! ! ! AS VARIAVEIS DO ARGUMENTO DE hipotenusa PODEM SER DIFERENTES DAQUELAS ! DO ARGUMENTO DA SUBROTINA. O VALOR DA VARIAVEL DEPENDE DA POSICAO QUE ! ESTA OCUPA ASSIM: ! ca RECEBE adjacente, co RECEBE oposto, hip RECEBE hipotenusa ! call hipotenusa(ca,co,hip) ! write(*,500) hip 500 format('O tamanho da hipotenusa sera: ',f15.6) ! stop end program prog_sub_1 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! SUBROTINA QUE CALCULA O VALOR DA HIPOTENUSA !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! subroutine hipotenusa(adjacente,oposto,hipote) implicit none ! real(kind=4), intent(in) :: adjacente,oposto real(kind=4), intent(out) :: hipote ! hipote = sqrt( adjacente*adjacente + oposto*oposto ) ! ! UMA SUBROTINA TERMINA SEMPRE COM O COMANDO RETURN return ! end subroutine !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!