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