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