Fortran 90/95 Wykład 2

Transkrypt

Fortran 90/95 Wykład 2
Fortran 90/95
Wykład 2
Janusz Andrzejewski
wtorek 19 marca 2013
Plan
●
Schemat blokowy
●
Główny segment
●
Podprogramy zewnętrzne
●
●
–
procedury
–
funkcje
Moduły
–
procedury
–
funkcje
Podprogramy wewnętrzne
–
Procedury
–
Funkcje
2
Składniki programu
Moduł
Główny
segment
Podprogramy
wewnętrzne
Podprogramy
w module
Podprogram
zewnętrzny
Podprogramy
wewnętrzne
Podprogramy
wewnętrzne
3
Składniki programu
●
●
●
●
●
●
W programie musi być tylko jeden segment główny
Ilość podprogramów zewnętrznych, ich kolejność występowania w pliku lub
plikach jest dowolna
Nazwa podprogramu zewnętrznego jest globalna tzn. jest widziana z
każdego miejsca w programie i dana nazwa może odnosić się tylko do
jednej procedury zewnętrznej
Powyższe stwierdzenie nie stosuje się do procedur w modułach
Procedura zewnętrzna oraz moduły nie mogą być dzielone pomiędzy dwa
lub więcej plików
Nazwy modułów muszą różnić się pomiędzy sobą
4
Segment główny
[PROGRAM nazwa_programu]
[czesc deklaracyjna]
[czesc wykonawcza]
[CONTAINS]
[segmenty wewnetrzne]
END [PROGRAM [nazwa_programu]]
Najprostszy program:
END
Uwaga: Powyższy program nic
nie robi !!!
Przykład:
PROGRAM Hallo
write(*,*) „Hallo world'
END PROGRAM Hallo
5
Schemat podprogramów
zewnętrznych
subroutine-nagłówek
function-nagłówek
[czesc deklaracyjna]
[czesc deklaracyjna]
[czesc wykonawcza]
[czesc wykonawcza]
[CONTAINS]
[segmenty wewnetrzne]
[CONTAINS]
[segmenty wewnetrzne]
END [SUBROUTINE [nazwa_pro]]
END [FUNCTION [nazwa_fun]]
Gdzie, nagłówek ma postać
Gdzie, nagłówek ma postać:
[przedrostek] SUBROUTINE [([lista
argumentów formalnych])]
[przedrostek] [typ_wyniku] FUNCTION
([lista argumentow formalych] )
[RESULT (zmienna)]
- przy czym może wystąpić albo
typ_wyniku albo RESULT
Na temat przedrostków – któryś z kolejnych wykładów !!!
6
Schemat segmentów cd.
●
●
●
Część deklaracyjna – fragment segmentu (głównego, procedury lub funkcji)
w której występuje deklaracja użycia modułów, definicja nowych typów
danych oraz deklaracja zmiennych oraz argumentów formalnych
Część wykonawcza – zasadniczy fragment segmentu w którym następuje
proces obliczeniowy
Segment wewnętrzny – są to funkcje lub procedury które są dostępne tylko
z tego segmentu (nie można ich wywołać z innych segmentów
zewnętrznych). W segmencie wewnętrznym nie można definiować innych
segmentów wewnętrznych, można wywoływać natomiast inne segmenty
wewnętrzne zdefiniowane w tym samym segmencie zewnętrznym
7
Procedura czy funkcja ?
●
●
●
●
●
Procedura i funkcja są do siebie bardzo podobne
Funkcja musi zwrócić jakiś wynik, w związku z tym musi wystąpić
odpowiednia instrukcja przypisania
Funkcje powinniśmy stosować wtedy, gdy nie ma potrzeby zmiany
argumentów oraz gdy wynik obliczeń możemy przekazać jako wartość
funkcji
Funkcje nie powinny powodować efektów ubocznych np. zmiany wartości
zmiennej globalnej
Procedurę powinniśmy stosować wtedy gdy chcemy wykonać operację które
powodują efekty uboczne
8
Przykład
SUBROUTINE testProc
print*,'Test procedury 1'
END SUBROUTINE
SUBROUTINE testProc2()
print*,'Test procedury 2'
END
FUNCTION fun1() RESULT (wyn)
INTEGER :: wyn
wyn=1; print*,'Test fun 1'
END FUNCTION fun1
INTEGER FUNCTION fun2()
PROGRAM glowny
INTEGER :: i
! wywolanie procedury
CALL testProc()
CALL testProc2 ! tak tez mozna
! wywolanie funkcji
i=fun1()
! i=fun1 ! nie można tak wywolac funkcji
i=fun2()
END PROGRAM glowny
fun2=2; print*,'Test fun 2'
END FUNCTION fun2
9
Moduły
MODULE nazwa_modulu
[część deklaracyjna]
[CONTAINS
Podprogramy ]
PROGRAM uzycieModulu
USE zmienne
izm1=2; rzm1=0.2
izm2=izm1/rzm1
END [MODULE [nazwa_modulu]]
rzm2=izm1-rzm1
Przykład:
print*,'Calkowite ',izm1, izm2
MODULE zmienne
Print*,'Rzeczywiste ',rzm1, rzm2
INTEGER :: izm1, izm2
END PROGRAM uzycieModulu
REAL :: rzm1, rzm2
END MODULE zmienne
10
Moduł
●
Moduł pozwala na:
●
●
●
●
●
●
●
Umieszczenie zmiennych (danych) które mogą być dostępne w
dowolnym miejscu programu (zmienne globalne)
Umieszczenie deklaracji własnych typów danych i związanych z nim
operacji
Umieszczenie „opisu argumentów do podprogramów” w celu
sprawdzania poprawności wywołania podprogramów
Grupowanie funkcji i procedur które są „ideologicznie” powiązane ze
sobą
Korzystanie z innych modułów
NIE wolno w sposób rekurencyjny bezpośredni czy pośredni korzystać z
tego samego modułu tzn: moduł A korzysta z B, to B nie może korzystać
zA
Nie powinno korzystać się z podprogramów zewnętrznych
11
Moduł – przykład użyteczny
MODULE RodzajeLiczb
INTEGER, PARAMETER ::
&
! Stale nazwane dla liczb calkowitych o dlugosci 4, 2 i 1 bajta
i4b=SELECTED_INT_KIND(9),
&
i2b=SELECTED_INT_KIND(4),
&
i1b=SELECTED_INT_KIND(2),
&
! stale nazwane dla liczb rzeczywistych pojedynczych i podwojnej precyzji
sp=KIND(1.0),
&
dp=SELECTED_REAL_KIND(2*PECISSION(1.0_sp))
END MODULE RodzajeLiczb
12
Moduł - użycie
PROGRAM test
USE RodzajeLiczb
IMPLICIT NONE
INTEGER(i1b) :: ai1b
INTEGER(KIND=i4b) :: ai4b
REAL(sp) :: rSP
REAL(KIND=dp) :: rDP, rNewDP
COMPLEX(KIND=dp) :: compDP
ai1b=1_i1b
ai4b=2*3_i4b
rSP=1.0
rSP=rSP*4.56_sp
rDP=2.0D0
rNewDP=3.145566_dp
compDP=(2.0_dp, 3.0_dp)
END Program test
13
Jawny interface
MODULE nic1
IMPLICIT NONE
CONTAINS
REAL FUNCTION fun(a)
REAL, INTENT(IN) :: a
fun=a*34.5
END FUNCTION fun
SUBROUTINE WyswWartFun(x, funk)
REAL, INTENT(IN) :: x
INTERFACE
REAL FUNCTION funk(x)
REAL, INTENT(IN) :: x
END FUNCTION funk
END INTERFACE
write(*,*)'Wart funkcji ',funk(x)
PROGRAM test
USE nic1
IMPLICIT NONE
REAL :: x
x=2.0
CALL WyswWartFun(x, fun)
END PROGRAM test
END SUBROUTINE
END MODULE nic1
14
Jawny interface 2
MODULE nic2
USE RodzajeLiczb
IMPLICIT NONE
CONTAINS
REAL(dp) FUNCTION fun(a)
REAL(dp), INTENT(IN) :: a
fun=a*34.5
END FUNCTION fun
SUBROUTINE WyswWartFun(x, funk)
REAL(dp), INTENT(IN) :: x
INTERFACE
FUNCTION funk(x) RESULT(wyn)
USE RodzajeLiczb
REAL(dp), INTENT(IN) :: x
REAL(dp) :: wyn
END FUNCTION funk
END INTERFACE
write(*,*)'Wart funkcji ',funk(x)
PROGRAM test2
USE nic1
USE RodzajeLiczb
IMPLICIT NONE
REAL(dp) :: x
x=2.0_dp
CALL WyswWartFun(x, fun)
END PROGRAM test
END SUBROUTINE
END MODULE nic2
15
Podprogramy w module
●
Składnia taka sama jak dla podprogramów zewnętrznych, z tym że na końcu
musi się znaleźć END SUBROUTINE lub END FUNCTION plus ewentualnie
może być dodatkowo nazwa podprogramu
●
mogą zawierać podprogramy wewnętrzne
●
mogą się nawzajem wywoływać
●
●
Mają dostęp do wszystkich zmiennych zadeklarowanych w części
deklaratywnej modułu
Poprzez użycie instrukcji USE mogą indywidualnie korzystać z dowolnego
modułu
16
Podprogramy wewnętrzne
●
●
●
●
Składnia taka sama jak dla podprogramów zewnętrznych, z tym że na końcu
musi się znaleźć END SUBROUTINE lub END FUNCTION
Nie mogą zawierać instrukcji CONTAINS czyli nie mogą zawierać innych
podprogramów wewnętrznych
Mają dostęp do wszystkich zmiennych występujących w danym
podprogramie zewnętrznym
Mają dostęp do wszystkich zmiennych występujących w danym
podprogramie będących w module oraz do wszystkich zmiennych będących
w tym module
●
Mogą się nawzajem wywoływać
●
Mogą być wywołane tylko z podprogramu w którym występują
17
Dziękuję
18