Rezultat podprogramu (wynik podprogramu, wartość zwracana przez podprogram) w programowaniu, to wartość, która zostaje wyznaczona przez podprogram i następnie przekazana do miejsca jego wywołania. Wartość przekazana przez podprogram może zostać następnie użyta w wyrażeniu do dalszego przetwarzania danych, bądź w pewnych przypadkach może zostać zignorowana (pominięta, odrzucona).
W zakresie przedmiotowego zagadnienia w językach programowania można spotkać różne rozwiązania, przy czym można wyodrębnić grupę typowych, najczęściej spotykanych zasad:
Jak wyżej zaznaczono rezultat podprogramu może zostać użyty bądź odrzucony, przy czym istnieją języki programowania, w których:
Udostępnienie rezultatu następuje w wyniku wyjścia z podprogramu, tj. albo na końcu bloku podprogramu, albo w wyniku wykonania instrukcji powrotu. Spośród spotykanych rozwiązań można wymienić sytuację, w której rezultat ten jest umieszczany jako odpowiednia fraza instrukcji powrotu. Tak jest np. w języku C – return wyrażenie;. Innym rozwiązaniem jest traktowanie nazwy funkcji jako zmiennej lokalnej, na której można wykonywać różne działania w treści podprogramu. Następnie wykonanie instrukcji wyjścia, w której nie specyfikuje się jawnie wartości rezultatu podprogramu, skutkuje przyjęciem jako rezultatu aktualnej wartości przypisanej do zmiennej reprezentowanej przez identyfikator podprogramu. Tak jest np. w języku Pascal.
Część autorów różnych języków programowania oraz publikacji w odniesieniu do podprogramu, który zwraca rezultat, stosuje pojęcie funkcji (także pojęcie podprogramu funkcyjnego), co stanowi analogię do tego pojęcia stosowanego w matematyce, w odróżnieniu od podprogramu, który nie zwraca rezultatu, w odniesieniu do którego stosuje pojęcie procedury. Ma to w niektórych językach programowania swoje odzwierciedlenie w składni tych języków. Przykładowo w języku Pascal i Fortran stosuje się odpowiednio słowo kluczowe function, gdy podprogram zwraca wartość i procedure (Pascal) lub SUBROUTINE (Fortran), gdy nie zwraca wartości. Nie ma jednak w literaturze przedmiotu jednolitych zasad w tym względzie. W języku C i pochodnych często stosuje się określenie funkcja do wszystkich podprogramów, w PL/1, czy ALGOL – procedura, także do podprogramów zwracających wartość.
Rezultat może zostać także zwrócony przez program, do systemu operacyjnego, z którego został wywołany, w postaci kodu powrotu. Kod ten może być następnie użyty w systemie. Jest to więc rezultat zwracany przez podprogram główny, nawet jeżeli wyjście z programu nastąpiło z określonego podprogramu wewnętrznego. Przykładowo w systemie DOS i pochodnych dostęp do kodu powrotu z programu zapewnia zmienna wbudowana ERRORLEVEL.
| C | Turbo Pascal |
|---|---|
#include "stdio.h"
int func();
{
int a;
scanf("x=%d\n", &a);
return a;
}
void main()
{
int result;
result=func();
printf("x*2=%d\n",result*2);
/* rezultat zostanie zignorowany, a pobrana
dana nie zostanie użyta do obliczeń */
func();
/* wypisana zostanie identyczna wartość jak powyżej
gdyż nowa, pobrana dana nie została nigdzie przypisana */
printf("x*2=%d\n",result*2);
}
|
program main;
var result:integer;
function func():integer;
begin
write('x=');
readln(func)
end;
begin
result:=func;
writeln('x*2=',result*2);
{ rezultat zostanie zignorowany, a pobrana
dana nie zostanie użyta do obliczeń }
func;
{ wypisana zostanie identyczna wartość jak powyżej
gdyż nowa, pobrana dana nie została nigdzie przypisana }
writeln('x*2=',result*2);
end.
|
GOSUB, możliwość taką dawały jedynie proste pseudopodprogramy (makra), definiowane w pojedynczych liniach kodu źródłowego za pomocą instrukcji DEF FN.void, stanowiący pewien substytut dla definiowania podprogramów bez zwracanej wartości.