3.6.3 Alocação Dinâmica de Memória

A idéia da alocação dinâmica de memória é simplesmente a de ser possível a utilização de um array sem ser necessário declararmos o tamanho desse array no início do programa junto à declaração de variáveis. Inicialmente, como já fizemos em um exemplo anterior, o tamanho do array era declarado no início do programa como no programa do cálculo do centro de massa. A declaração tinha a seguinte forma:

real(kind=4), dimension(5) :: x, y, z, m

Da maneira como está declarado acima, as variáveis indexadas $x$, $y$, $z$ e $m$ terão tamanho fixo igual a 5. O propósito desta seção é fazer com que o tamanho seja dessas variáveis indexadas seja atribuído a partir de um arquivo externo e também que possa alterar de tamanho durante a execução do programa sem a necessidade de uma segunda compilação.

Para utilizarmos a alocação dinâmica de memória, ou seja, atribuir um tamanho para um array, precisamos dizer para o compilador que esta operação será realizada. Isto é feito no momento em que se declara uma variável:

real(kind=4), allocatable, dimension(:) :: x, y, z, m

Em conjunto com esta declaração de variáveis, o aray deve possuir um tamanho a ser informado poteriorment. O tamanho desse array irá depender do problema a ser resolvido e também do tamanho da memória RAM do computador. A variável que indica o tamanho do array poderá ser lido a partir de um arquivo ou a partir do teclado. Uma vez que temos o tamanho desse array é necessário dizer ao compilador que o array terá um tamanho $n$. No programa isto será feito da seguinte forma:

allocate(x(n),stat=err_x)
allocate(y(n),stat=err_y)
allocate(z(n),stat=err_z)
allocate(m(n),stat=err_m)

A variável $n$ indica o tamanho do array e deve possuir algum valor antes da declaração allocate. As variáveis err_x, err_y, err_z e err_m são variáveis inteiras associadas à alocação das variáveis, no processo de alocação se essas variáveis retornarem 0 (zero) significa que elas foram alocadas com sucesso ou se retornarem qualquer valor diferente de zero significa que houve algum problema com a alocação do array. Para exemplificar faremos o programa abaixo:

!
! PROGRAMA PARA EXEMPLIFICAR A ALOCACAO DINAMICA DE MEMORIA
!
program allocdyn
implicit none

real(kind=4), allocatable, dimension(:) :: x, y
integer :: i, n, err_x, err_y
!
err_x=0; err_y=0
!
write(*,*)'Digite o tamanho do seu array (numero inteiro):'
read(*,*) n
!
allocate(x(n),stat=err_x)
allocate(y(n),stat=err_y)
!
if( err_x /= 0 ) then
        write(*,*)'Problema para allocar o vetor x! Saindo!!!'
        stop
end if
if( err_y /= 0 ) then
        write(*,*)'Problema para allocar o vetor y! Saindo!!!'
        stop
end if
!
do i=1, n
        x(i) = 2.0
        y(i) = 0.0
end do
do i=1, n
        if ( i == 1 ) then
                 y(i) = x(i)
        else
                y(i) = y(i-1) + 1.0
        end if
end do
!
do i=1, n
        write(*,1000) i,x(i),y(i)
end do
!
deallocate(x)
deallocate(y)
!
1000 format(i6,f10.3,f10.3)
!
stop
end program allocdyn
!