Rezultat podprogramu

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[a][1][2], stosu – m.in. Forth[3][4], i inne rozwiązania),
  • udostępnianie przez podprogram rezultatu:

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[9][10][11] i inne,
  • nie ma możliwości pominięcia wartości zawracanej przez podprogram – m.in. język Pascal[5] i inne, choć taka możliwość bywa w kolejnych implementacjach tych języków dodawana – m.in. Turbo Pascal[6] 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[9][10][11]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[5][6].

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[5][6] i Fortran[12] stosuje się odpowiednio słowo kluczowe function, gdy podprogram zwraca wartość i procedure (Pascal[5][6]) lub SUBROUTINE (Fortran[12]), gdy nie zwraca wartości. Nie ma jednak w literaturze przedmiotu jednolitych zasad w tym względzie. W języku C[9][10][11] i pochodnych często stosuje się określenie funkcja do wszystkich podprogramów, w PL/1[7][8], czy ALGOL[13][14] – 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[9][10][11] Turbo Pascal[6]
#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.

UwagiEdytuj

  1. We wczesnych wersjach Basica wartości nie mogły zwracać podprogramy wywoływane instrukcją wywołania GOSUB, możliwość taką dawały jedynie proste pseudopodprogramy (makra), definiowane w pojedynczych liniach kodu źródłowego za pomocą instrukcji DEF FN.
  2. We wczesnych wersjach C każdy podprogram zwracał wartość (zaszłość), w późniejszych implementacjach wprowadzono typ pusty void, stanowiący pewien substytut dla definiowania podprogramów bez zwracanej wartości.

PrzypisyEdytuj

  1. Zbigniew Czech, Krzysztof Nałęcki, Stanisław Wołek: Programowanie w języku BASIC. Wyd. drugie uzupełnione. Warszawa: Wydawnictwa Naukowo-Techniczne, 1985. ISBN 83-204-0776-1. (pol.)
  2. Wacław Iszkowski: Nauka programowania w języku BASIC dla początkujących. Warszawa: Wydawnictwa Naukowo-Techniczne, 1987, seria: Mikrokomputery. ISBN 83-204-0834-2. (pol.)
  3. Jan Bielecki: Język FORTH. Warszawa: Wydawnictwa Naukowo-Techniczne, 1988, seria: Mikrokomputery. ISBN 83-204-0930-6. (pol.)
  4. Jan Ruszczyc: Poznajemy FORTH. Warszawa: SOETO, 1987, seria: Informatyka mikrokomputerowa. (pol.)
  5. a b c d e Michał Iglewski, Jan Madey, Stanisław Matwin: Pascal. Język wzorcowy – Pascal 360. Wyd. wydanie trzecie – zmienione. Warszawa: Wydawnictwa Naukowo-Techniczne, 1984, seria: Biblioteka Inżynierii Oprogramowania. ISBN 83-85060-53-7. ISSN 0867-6011. (pol.)
  6. a b c d e f Andrzej Marciniak: Borland Pascal 7.0. Poznań: Nakom, 1994, seria: Biblioteka Użytkownika Mikrokomputerów. ISBN 83-85060-53-7. ISSN 0867-6011. (pol.)
  7. a b Jan Bielecki: Rozszerzony PL/I i JCL w systemie OS/RIAD. Warszawa: Państwowe Wydawnictwo Naukowe, 1986, seria: Biblioteka Informatyki. ISBN 83-01-06146-4. (pol.)
  8. a b M. I. Auguston i inni: Programowanie w języku PL/1 OS JS. Warszawa: Państwowe Wydawnictwo Naukowe, 1988. ISBN 83-01-07463-9. (pol.)
  9. a b c d e Brian W. Kernighan, Dennis M. Ritche: Język C. Warszawa: Wydawnictwa Naukowo-Techniczne, 1988, seria: Biblioteka Inżynierii Oprogramowania. ISBN 83-204-1067-3. (pol.)
  10. a b c d e Jan Bielecki: Turbo C z grafiką na IBM PC. Warszawa: Wydawnictwa Naukowo-Techniczne, 1990, seria: Mikrokomputery. ISBN 83-204-1101-7. (pol.)
  11. a b c d e Jan Bielecki: Od C do C++, programowanie obiektowe w języku C. Warszawa: Wydawnictwa Naukowo-Techniczne, 1990. ISBN 83-204-1332-X. (pol.)
  12. a b Ryszard K. Kott, Krzysztof Walczak: Programowanie w języku Fortran 77. Warszawa: Wydawnictwa Naukowo-Techniczne, 1991. ISBN 83-204-1362-1. (pol.)
  13. Joanna Jonkisz, Jan Makuch, Stanisław Starzak: Programowanie w językach Algol 60 i Fortran 1900. Łódź: Wydawnictwo Politechniki Łódzkiej, Politechnika Łódzka, Ośrodek Elektronicznej Techniki Obliczeniowej, 1982, seria: Skrypty dla szkół wyższych. (pol.)
  14. Jan Małuszyński, Krzysztof Pisecki, A. van Wijngaarden, B.J. Mailloux, J.E.L. Peck, C.H.A. Koster, M. Sintzoff, .H. Lindsey, L.G.L.T. Meertens, R.G. Fisker, w tłumaczeniu Jana Małuszyńskiego i Krzysztofa Piseckiego: Algol 68. Wprowadzenie do języka Algol 68. Zmieniony raport o języku algorytmicznym Algol 68. Warszawa: Wydawnictwa Naukowo-Techniczne, 1980, seria: Informatyka. ISBN 83-204-0161-5. (pol.)

BibliografiaEdytuj

  1. Michael Marcotty, Henry Ledgord, tłumaczenie: Krystyna Jerzykiewicz: W kręgu języków programowania. Warszawa: Wydawnictwa Naukowo-Techniczne, 1980, seria: Biblioteka Inżynierii Oprogramowania. ISBN 83-204-1342-7. (pol.)
  2. John E. Nicholls: Struktura języków programowania. Warszawa: Wydawnictwa Naukowo-Techniczne, 1980, seria: Informatyka. ISBN 83-204-0246-8. (pol.)