Přeskočit na obsah

Pointery

Pointery nebo také ukazatele jsou proměnné které existují za učelem toho aby odkazovali na jinou proměnnou. Pointery mají některé podobnosti s poitery z jiných jazyků, ale nejsou stejné. Pointery se hodí pro speciální datové struktůry (např. propojené seznamy), ukazování na procedury nebo pro interoperabilitu s jazykem C.

Pinter deklarujeme jako každou proměnnou jen ji přidáme specifikace ,pointer ::. Pokud vytváříme pointer na pole můsíme vytvořit pole pointerů, ale místo velikosti stačí napsat : a velikost se doplní podle cíle pointeru.

Aby mohlo být na proměnnou ukazováno pomocí poiteru je třebe k ní přidat pri deklaraci specifikace ,target ::.

Asociace mezi proměnnou a pointerem se vytváří pomocí operátoru =>.

Pointery můžeme na počátku inicializovat na stav null pomocí null(). Je rozumné dát pointerům tento počateční stav než je nechat nedefinované.

Pointerům můžeme alokovat paměť podobně jako polím pomocí allocate(_...pointery..._). Stejně můžeme použít i deallocate()

Pro testování zda byl pointer již asociován s nějakou proměnnou používáme příkaz associated(_jmenoPointeru_). Tuto funkci můžeme použít, také na testování zda je pointer spojen s konkrétní proměnnou associated(_jmenoPointer_, _jmenoProměnné_).

Pointer oddělíme od proměnné pomocí funkce nullify(_pointer_).

    program do_concurrent
      use iso_fortran_env
      implicit none
     
      integer :: i
      integer,pointer :: a(:) => null()
      integer,target :: b(10) = [(i,i=1,10)]
      integer,target :: c(5) = [(i,i=1,5)]
      
      real :: g
     
      do i=1,5
        call random_number(g)
        if(g<0.5) then
        a => c
        else
        a => b
        end if
        
        a = 2*a
        
        write(*,*) associated(a)
        if(associated(a,b)) write(*,*) "b"
        if(associated(a,c)) write(*,*) "c"
    
        write(*,'(*(i2,1x))') a
        
        nullify(a)
        write(*,*) associated(a)
        write(*,*) ""
      end do
     
    end program