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
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