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

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

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