MFF UK / Ústav teoretické fyziky / Tomáš Ledvinka
Přednášky
. . . . . . . . . . . . . . . . . . . . . . . . . .
Programování pro fyziky (1.r)
  Úvod
  Programy a algoritmy
  Píšeme program
  Píšeme program II
  Procedury a funkce
    Procedury a funkce
    Příklad funkce
    Makro nebo podprogram?
    Procedury a struktura prog.
    Lokální proměnné
    Hodnotou či odkazem?
    Pravidla a dokumentace
  Malujeme funkce
  Chyby. Typy I.
  Typy II. Pole a Záznamy
  Pole II.Řetězce.Soubory.
  Gnuplot.Interpolace...
  Matice. Velké O...
  Fronta,Zásobník. Postscript
  Bin. soubory, ...
  Ukazatele,Objekty, ...
Počítačová algebra
Klasická elektrodynamika (2.r)
Vybrané partie OTR

Cvičení
. . . . . . . . . . . . . . . . . . . . . . . . . .
Programování pro fyziky (1.r)
Teoretická mechanika (2.r)
Klasická elektrodynamika (2.r)


Věda
. . . . . . . . . . . . . . . . . . . . . . . . . .
Diskové zdroje v OTR
Hyperbolické systémy v OTR


Kontakt
. . . . . . . . . . . . . . . . . . . . . . . . . .
Email
Konzultační hodiny


Ostatní
. . . . . . . . . . . . . . . . . . . . . . . . .
Mallorca
Ze společnosti
Parametry procedur

Především můžeme hodnoty předávat prostřednictvím společných (tedy většinou globálních) proměnných .

program ProcSGlobProm;

var i;

  procedure MojeProc;
  begin
i:=0;
  end;

begin
i:=1;
  Writeln(i);
MojeProc;
  Writeln(i);
end.

Pak můžeme použít parametry funkce. Nejjednodušším případem je tzv. předání hodnotou.

program ProcSParHodnotou;

var i;

  procedure MojeProc(b:integer);
  begin
b:=0;
  end;

begin
i:=1;
  Writeln(i);
MojeProc(i);
  Writeln(i);
end.
V  tomto případě mi program vypíše dvě jedničky. Procedura se dozví jakou hodnotu mělo i, ale dále pracuje jen s touto hodnotou. Proměnné b přísluší vlastní chlívek v paměti a jeho modifikací se nemění hodnota chlívku i.

Nyní jak vypadá předání parametru odkazem
program ProcSParOdkazem;

var i;

  procedure MojeProc(var b:integer);
  begin
b:=0;
  end;

begin
i:=1;
  Writeln(i);
MojeProc(i);
  Writeln(i);
end.
V  tomto případě mi program vypíše jedničku a nulu. Procedura se dozví kde je uskladněna proměnná i, a dále pracuje s tímto odkazem, tedy s proměnnou samou. Předání parametru odkazem zařídí, že chlívek s názvem i se uvnitř procedury jmenuje ještě též b.

[Tady zatím nemám sílu vymýšlet jak sem přepsat to povídání o chlívcích a odkazech, kdyby se někomu chtělo napsat javascriptovou animaci, uvítám to... ]

Předávání odkazem je tak možné použít i k navrácení hodnoty tam, kde je použití funkce nevhodné.
Především funkce neumí pohodlně vrátit dvě hodnoty zároveň. Často se také používají funkce var parametry na návrat hodnot, zatímco funkce sama  vrací jen  logickou informaci, zda se to povedlo:

  function NactiSeznam(var Sz : typSeznam; JakDlouhy : integer) : boolean;
  begin
....

....
NactiSenznam := NacenaDelka = JakDlouhy;
  end;
 
Ještě se o tom zmíníme, ale je třeba uvést, že kromě použití var-parametrů pro návrat hodnoty, je další indikací pro použití var-parametrů velikost předávaných dat. Náročnost předání odkazu je totiž nezávistlá na velikosti toho na co odkazuji.
.