Fortran/Procedury i funkcje

Tworząc programy niejednokrotnie zdarzy Ci się powtarzać kilkakrotnie ten sam fragment kodu. Będzie on dotyczył różnego rodzaju czynności. Może także się zdarzyć, że będziesz potrzebował użyć języka Fortran w projekcie, który będzie tworzony przy użyciu języka C. W podobnych przypadkach użyjesz funkcji. Funkcję można zdefiniować jako wydzielony fragment programu wyspecjalizowany do wykonywania określonej czynności. W tytule tego rozdziału zostało także użyte słowo procedura. Jest to z kolei pewien przypadek funkcji, kiedy nie zwraca ona żadnej wartości – np. wyniku obliczeń. Różni się ona przy tym sposobem deklaracji oraz wywołania.

Korzystanie z funkcji edytuj

Ucząc się trudnej sztuki programowania z tego podręcznika spotkałeś się już z funkcjami. Dobrym przykładem mogą tu być funkcje write oraz print, które służą do obsługi wyjścia programu. Funkcję wywołuje się w następujący sposób (elementy w nawiasach kwadratowych są nieobowiązkowe):

  [zmienna =] nazwa_funkcji([argumenty funkcji])

W języku Fortran istnieje także możliwość przypisania funkcji pewnej wartości i korzystania z niej jako ze zmiennej. Oto jej deklaracja:

  nazwa_funkcji([argumenty funkcji]) = wartość

Deklarowanie funkcji edytuj

W języku Fortran funkcję definiuje się w sposób następujący:

  [typ danych] FUNCTION nazwa_funkcji ([argumenty funkcji])
    instrukcje...
  END

Zwracanie wartości edytuj

W przeciwieństwie do np. C, w Fortranie wartość, która ma zostać zwrócona, jest przypisywana nazwie funkcji. Natomiast słowo RETURN powoduje natychmiastowe wyjście z funkcji. Wygląda to mniej więcej tak:

  real function kwadrat (a)
     real, intent(in) :: a
     kwadrat = a**2
     return
  end function

Funkcja rekurencyjna edytuj

W języku Fortran stworzenie funkcji rekurencyjnej nie jest takie proste, a dodatkowo nie jest zgodne ze standardem f77. Aby funkcja mogła wywołać samą siebie, musimy użyć słowa recursive:

  recursive function nazwa
    nazwa()
  end function nazwa

Procedura edytuj

Oprócz funkcji, wyróżniamy jeszcze procedurę. Definiuje się ją tak:

  subroutine nazwa_procedury ([argumenty])
    instrukcje
    [return]
  end subroutine nazwa_procedury

Aby wywołać procedurę, musisz użyć instrukcję call:

  call nazwa_procedury ([argumenty])