Capítulo 7: Comandos de Especificação: Designação de Áreas de Memória

7.1. Introdução

[C] Neste capítulo, aprenderemos a reservar áreas de memória, com os seguintes objetivos:

  1. Determinar a quantidade de memória que deve ser reservada para variáveis indexadas.
  2. Indicar áreas de memória que podem ser acessadas por diferentes unidades de programa.


7.2. Comando DIMENSION

[D] O comando DIMENSION é usado para especificar nomes simbólicos como nomes de variáveis indexadas, define o número de dimensões (índices) de cada conjunto de vi´s e especifica os limites de cada dimensão.
 

[CF] A forma geral do comando DIMENSION é:

    DIMENSION c(d[,d]...)[,c(d[,d]...)]

sendo que:

- "c" é um nome de conjunto;
- "d" é um declarador de dimensão (que podem ser no máximo 7) e especifica os limites para cada índice do conjunto, em uma das formas: superior ou inferior:superior
- superior: o índice varia de 1 até superior.
- inferior:superior: o índice varia de inferior até superior.
 

[E] Exemplos:

    dimension a(0:10),b(3,3),c(3,4,5)
 

7.3. Comando COMMON

[D] O comando COMMON é usado para especificar áreas de memória que são utilizadas em comum por várias unidades de programa, tal como o programa principal e subprogramas do tipo FUNCTION ou SUBROUTINE.
 

[C] Áreas de memória designadas por uma unidade de programa não são "enxergadas" pelas outras unidades. Assim, o que COMMON faz é permitir que diferentes unidades de programa "enxerguem" uma dada área de memória.
 

[CF] A forma geral do comando COMMON é:

    COMMON[/r/] lista

sendo que:

- "r" é um rótulo do bloco de variáveis que terão suas áreas de memória especificadas.
- "lista" é uma lista com nomes de variáveis que terão suas áreas de memória especificadas.
 

[E] Exemplos:

1) common m,a,x

2) dimension a(10),b(5,20)
    common/bloco1/a,b
 

[C] O mesmo comando COMMON, escrito do mesmo jeito, deve aparecer em cada unidade de programa que pretende ter acesso às variáveis definidas num dado bloco.

7.4. Unidades de programas do tipo MODULE

[C] As unidades de programa do tipo MODULE existem a partir do Fortran 90 e podem substituir todas as ocorrências do comando COMMON, do comando INCLUDE (não apresentado nesta apostila) e funções de comando (Capítulo 11).

[C] Numa unidade de programa do tipo MODULE podem se definir tipos e valores de constantes e variáveis. Ainda é possível incluir subprogramas, mas este tópico não será abordado.

7.5. Comando USE

[CF] O comando USE é utilizado para definir uma unidade de programa do tipo MODULE que deve ser incluída no programa.

[E] Exemplo de utilização das unidades de programa do tipo MODULE e do comando USE:

    module modulo01
      integer:: a=2,b=3
    end module modulo01

    module modulo02
      integer:: a=4,b=5
    end module modulo02

    program exmodls
! Objetivo: exemplifica o uso dos subprogramas do tipo MODULE
    use modulo01
    implicit none
    integer c,d
! Nas duas linhas a seguir, serão usados os valores de a e b declarados
! no módulo modulo01:
    c=a+b
    d=a*b
    print *,a,b,c,d
! Na subrotina abaixo, ainda serão usados os valores de a e b declarados
! no módulo modulo01, demonstrando a compartilhação de dados entre o
! programa principal e um subprograma:
    call subrotina01
! A subrotina abaixo é idêntica à anterior, com a única diferença que
! utiliza novos valores para a e b declarados no módulo modulo02:
    call subrotina02
    stop
    end

    subroutine subrotina01
    use modulo01
    implicit none
    integer c,d
    c=a+b
    d=a*b
    print *,a,b,c,d
    return
    end

    subroutine subrotina02
    use modulo02
    implicit none
    integer c,d
    c=a+b
    d=a*b
    print *,a,b,c,d
    return
    end

7.6. Comando PARAMETER

[D] O comando PARAMETER fornece um meio de se representar uma constante por um símbolo, como na Matemática, em vez de representá-la por um valor.
 

[CF] A forma geral do comando PARAMETER é:

    PARAMETER(ns=e[,ns=e]...)

sendo que:

- "ns" é um nome simbólico.
- "e" é uma constante ou uma expressão constante.
 

[C] PARAMETER é um comando de especificação e deve ser escrito entre os comandos de especificação. Porém cada constante simbólica deve ser definida antes de qualquer referência a ela.
 

[C] Os novos símbolos das constantes definidas dentro de um comando PARAMETER seguem as mesmas regras para os nomes de variáveis (em relação ao tipo).
 

[C] O valor de uma constante definida em PARAMETER jamais é ou pode ser alterado durante a execução do programa.
 

[E] Exemplo:
    ?
    real pi
    parameter(pi=3.1415927)
    ?
 

7.7. Comando PROGRAM

[D] O comando PROGRAM é usado para identificar o programa principal.
 

[C] Todo programa possui um único programa principal.
 

[CF] A forma geral de PROGRAM é:

    program nome

sendo que:

- "nome" é um nome simbólico definido para o programa principal.
 
 

7.8. Comandos ALLOCATE, DEALLOCATE E ALLOCATABLE

[CF] Os comandos ALLOCATE, DEALLOCATE E ALLOCATABLE têm por função permitir que uma variável indexada possa ser dimensionada durante a execução do programa.
 

[CF] ALLOCATABLE: indica que a variável indexada vai ter os valores mínimos e máximos para o seu(s) índice(s) determinados em algum ponto do programa. A área de memória para esta variável ainda não está reservada.
 

[CF] ALLOCATE: dimensiona a variável indexada e reserva (aloca) um espaço de memória para ela.
 

[CF] DEALLOCATE: desaloca, mas não extingue, a variável indexada, liberando a memória antes por ela ocupada.
 

[E] No exemplo a seguir temos vários trechos de um programa sendo que as variáveis indexadas A, B, C e D estão sendo
dimensionadas, alocadas e desalocadas usando os comandos ALLOCATE, DEALLOCATE E ALLOCATABLE:
    ...
    integer i,j,k,l,m,n
    integer,dimension(:,:),allocatable :: a
    real,dimension(:),allocatable :: b,c
    real,dimension(:,:,:),allocatable :: d
    ...
    print *,'Digite os minimos e maximos das 2 dimensoes de A:'
    read *,i,j,k,l
    allocate(a(i:j,k:l))
    ...
    print *,'Digite o minimo e o maximo da unica dimensao de B:'
    read *,i,j
    print *,'Digite o minimo e o maximo da unica dimensao de C:'
    read *,k,l
    allocate(b(i:j),c(k:l))
    ...
    print *,'Digite os minimos e maximos das 3 dimensoes de D:'
    read *,i,j,k,l,m,n
    allocate(d(i:j,k:l,m:n))
    ...
    deallocate(a,d)
    ...
    deallocate(b)
    ...
    deallocate(c)
    ...