2014-12-17 15 views
5

Miałem wrażenie, że główne różnice między podprogramami i funkcjami w Fortranie polegały na tym, że funkcje zwracały wartości, podczas gdy podprogramy zmieniały niektóre lub wszystkie wartości przekazywane jako argumenty. Ale potem nauczyłem się, że można również modyfikować zmienne przekazywane do funkcji jako argumenty. Jestem zdezorientowany i nie mogę znaleźć dobrego odniesienia do różnic między nimi.Jakie są różnice między funkcjami i podprogramami w Fortranie?

Jakie są więc różnice między tymi dwoma konstruktami, a kiedy i dlaczego należy preferować jeden nad drugim?

+2

Największą różnicą jest to, że podprogramy wywoływane są za pomocą instrukcji 'CALL' i dlatego nie mogą być częścią wyrażenia. –

Odpowiedz

7

To, czy używać jednego czy drugiego, jest mniej więcej kwestią stylu programowania. Możesz zapisywać argumenty obu funkcji i podprogramów jako intent(in), intent(inout) lub intent(out).

Mój osobisty styl może jednak używać tylko argumentów intent(in) dla funkcji, co jest również wymagane w przypadku funkcji pure. Wyjątek od tej reguły można wprowadzić, gdy argument en error code intent(out) jest konieczny.

Ukryta w funkcjach funkcja subtelnej pułapki, która zwraca różne wyniki dla tej samej wartości argumentu wejściowego. Rozważmy hipotetyczną funkcja powrocie losową liczbę

real function rnd() 
end function 

wzywającą go raz

x = rnd() 

jest całkowicie OK. Wywołanie go wielokrotnie w pojedynczym wyrażeniu

x = (rnd() + rnd())/2 

może spowodować, że funkcja zostanie wywołana tylko raz. Reguły języka Fortran dopuszczają takie zachowanie. Dlatego standardowa procedura Fortrana dla uzyskania losowych liczb random_number() jest podprocedurą (i ponieważ wszystkie wewnętrzne funkcje są pure).

Gdziekolwiek nie możesz skorzystać z funkcji, użyj podprogramu.

Dowolna funkcja może zostać przekonwertowana na podprogram przez przeniesienie zmiennej wyniku do atrapa z intent(out). Odwrotny proces może być bardziej problematyczny.

Powiązane problemy