Search code examples
fortranpack

How to use the value of an allocatable argument?


I have the following code and I would like to save the value of idx to use afterwards.

program use_value_allocatable

  implicit none
  integer :: i, ii
  integer, dimension(3) :: array_save
  character(1), dimension(3) :: array_char_ref = (/'a','b','c'/), array_char_1 = (/'c','a','b'/)
  integer, allocatable :: idx(:)

  array_save = 0
  do i = 1, 3
     idx = pack([(ii,ii=1,3)], array_char_ref == array_char_1(i) )

     print*, 'i=', i, ', idx=', idx, ', array_save(i) =', array_save(i)
!!$     array_save(i) = idx
     deallocate(idx)
  end do

end program use_value_allocatable

Having array_save(i) = idx in the code leads to an error as follows:

Error: Incompatible ranks 0 and 1 in assignment at (1)

So, I can conclude that I cannot use the value of an allocatable variable (here idx). How I can circumvent this problem?

P.S.: in this example I assume that idx will always be an integer of dimension 1


Solution

  • As you say, "idx will always be an integer of dimension 1", so you just need

    array_save(i) = idx(1)
    

    i.e. you need to store the first (and only) element of idx in array_save(i), rather than the whole array.

    A side note: you do not need the line deallocate(idx). idx will be implicitly re-allocated by the line idx = ..., and will be automatically deallocated when it drops out of scope.