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: brak możliwości przekazania rezultatu z podprogramu (a więc wymiana danych między podprogramem a otoczeniem musi odbywać się za pomocą innych konstrukcji programistycznych, np. zmiennych globalnych – m.in. wczesne wersje języka BASIC, stosu – m.in. Forth, i inne rozwiązania), udostępnianie przez podprogram rezultatu: dla wybranych podprogramów – m.in. Pascal, PL/I i inne, dla wszystkich podprogramów – m.in. język C i inne.

Jak wyżej zaznaczono rezultat podprogramu może zostać użyty bądź odrzucony, przy czym istnieją języki programowania, w których: istnieje standardowo możliwość pominięcia wartości zawracanej przez podprogram – m.in. język C i inne, nie ma możliwości pominięcia wartości zawracanej przez podprogram – m.in. język Pascal i inne, choć taka możliwość bywa w kolejnych implementacjach tych języków dodawana – m.in. Turbo Pascal i inne.

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.

+ Przykłady 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.

Uwagi

Przypisy

Bibliografia

Kategoria:Konstrukcje programistyczne Kategoria:Strony z przykładowym kodem C