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. 2: Fortran 95 - Struktury
1. Wprowadzenie
Struktury oznaczają nowe, zdefiniowane przez użytkownika (programistę), złożone typy zmiennych.
Składają się one z dowolnej liczby zmiennych o typach zadeklarowanych wcześniej (np. liczb całkowitych
i zmiennoprzecinkowych, łańcuchów tekstowych), pogrupowanych w jednym obszarze pamięci.
2. Deklaracja nowego typu zmiennej (struktury)
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
type
:: target_type
character(15)
:: name ! name of object
real
:: ra, dec ! celestial coordinates, degrees
integer
:: time ! exposure time requested, secs
end type
target_type
type (target_type)
:: old_target, new_list(30
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
© 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 ––
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.
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