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:
Da maneira como está declarado acima, as variáveis indexadas ,
,
e
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:
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 . No programa isto será feito da seguinte forma:
A variável 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
!