background image

J

ęzyki 

P

rogramowania i 

S

ystemy 

O

peracyjne 

2

––  I N Ż Y N I E R I A   W I R T U A L N A   P R O J E K T O W A N I A  –– 

 

Lab. 3: Fortran 95 - Wskaźniki

1. Wprowadzenie

Wskaźnik (ang. Pointer) można interpretować jako odnośnik do adresu w pamięci komputera, gdzie 

przechowywana   jest   wskazywana   zmienna.   Użycie   wskaźników   ułatwia   implementację   dynamicznych 
struktur  danych  takich  jak  listy,  drzewa  i  stosy.   Przekazywania   danych   do  procedur/funkcji  w  postaci 
wskaźników zmniejsza wymagania pamięciowe komputera (zmienne nie są deklarowane dwukrotnie).

Z użyciem wskaźników możliwe jest także zadeklarowanie tablicy, której elementami będą tablice o 

różniących się rozmiarach.

2. Deklaracja wskaźnika i powiązanie ze zmienną

W języku Fortran wskaźników nie traktuje się jako osobnego typu danych, ale jako właściwość innych 

typów. Oznacza to, że deklarując wskaźnik należy określić, na jaki typ zmiennej będzie wskazywał, np.

integer, pointer

 :: p1 

real*8, dimension(:), pointer

 :: p 

Po   zadeklarowaniu,   wskaźnik   musi   zostać   powiązany   ze   zmienną     z   użyciem   polecenia  

=>

Wskazywana zmienna musi być tego samego typu i mieć atrybut 

target

), np.:

real*8, dimension(:), pointer

 :: p 

real*8, target 

 :: x(2)=1.0, y(4)=2.0 

p => x
write(*,

'(5F8.4)'

) p

!wynik:

1.0000  1.0000

p => y(1:3)
write(*,

'(5F8.4)'

) p

!wynik:

2.0000  2.0000  2.0000

y(1)= 2.5

p(2)= 2.1
write(*,

'(5F8.4)'

) p

!wynik:

2.5000  2.1000  2.0000

W powyższym  przykładzie  w zależności na  co   wskazuje  

p

,  wyświetlane   będą  wszystkie  elementy 

tablicy  

x

  lub   pierwsze   trzy   elementy   tablicy  

y

.   Zmiana   wartości   wskazywanej   zmiennej   nie   wymaga 

ponownego   przypisania   wskaźnika,   zaś   przypisywanie   wartości  

p

  powoduje   zmianę   wskazywanej 

zmiennej.

Wskaźnik może nie być powiązany z żadną zmienną. Aby to uzyskać, stosuje się polecenie 

nullify

np.

if (associated(p)) nullify(p)

Funkcja 

associated 

zwraca wartość 

.true.

 jeżeli wskaźnik jest powiązany ze zmienną. Ponieważ po 

zadeklarowaniu wskaźniki znajdują się w stanie niezdefiniowanym, zaleca się użycie  funkcji 

nullify 

na 

początku programu.

Uwaga:  jeżeli   wskaźnik   wskazywał   na   tablicę   alokowaną   dynamicznie,   która   uległa   zwolnieniu,   jego 
użycie może prowadzić do błędów działania programu.

© Witold Stankiewicz, 2011

1/2

background image

J

ęzyki 

P

rogramowania i 

S

ystemy 

O

peracyjne 

2

––  I N Ż Y N I E R I A   W I R T U A L N A   P R O J E K T O W A N I A  –– 

 

3. Przekazywanie danych do podprogramów z użyciem wskaźników

Przykład przedstawia przekazanie niezaalokowanej zmiennej typu 

integer

 do procedury, wewnątrz 

której następuje przydzielenie pamięci.

program wskazniki1
interface

  subroutine procedura(id1)
  

integer, dimension(:), pointer

 :: id1

  end subroutine sub
end interface

integer, dimension(:), pointer

 :: id

call procedura(id)

! Po wywołaniu procedury wskaźnik id wskazuje na to samo

end

! miejsce w pamięci, co id1

subroutine procedura(id1)
  implicit none

  

integer, dimension(:), pointer

 :: id1

  

integer

 n

!  ...

  read(7,*) n

  allocate (id1(n))

! wskaźnik id1 wskazuje na miejsce w pamięci, gdzie  

end subroutine procedura

! znajduje się tablica (bez nazwy) o rozmiarze n

 

Uwaga: jeżeli procedura zostanie wywołana ponownie, poprzednio zarezerwowana pamięć stanie 
się niedostępna, ale nie ulegnie zwolnieniu – co może prowadzić do zajęcia całej dostępnej pamięci 
komputera.

4. Tablica tablic

Używając własnych struktur wykorzystujących wskaźniki, możliwe jest stworzenie tablicy 

x

 (o roz-

miarze 

n

), której elementami są inne tablice (o rozmiarze 

m

), np.

type

 :: wtab

  

real*8, dimension(:), pointer

 :: element

end 

type

 wtab

type(wtab), allocatable 

:: x(:)

integer

 m,n

!...

allocate(x(n))
do i = 1,n

  m=i+1
  allocate(x(i)%element(m))

end do

4. Zadanie

Przetestować podane przykłady. Napisać podany przez prowadzącego program.

5. Literatura

1) Clive Page. Fortran90 for Fortran77 Programmers. 

http://www.star.le.ac.uk/~cgp/f90course/f90.html

2) Dariusz Chrobak. Fortran praktyka programowania. MIKOM PWN, 2003. ISBN 83-7279-361-1
3) Janusz R. Piechna. Programowanie w języku Fortran 90 i 95. Oficyna Wydawnicza Politechniki 

Warszawskiej, 2000. ISBN 83-7207-225-6

4) Maciej Zadora, Mariusz Zając. Komputerowe Symulacje Numeryczne Fortran 95. 

http://fatcat.ftj.agh.edu.pl/~majozo/paper.pdf

5) Dokumentacja na serwerze dydaktycznym 

http://stanton.ice.put.poznan.pl/student/

© Witold Stankiewicz, 2011

2/2