Dynamická alokace paměti

Pokud nevíme předem, jak velká budou vstupní data, která chceme zpracovávat, potřebujeme využít možnost "říct si o pamět" během vykonávání programu.

Pamět programu přiděluje operační systém. V pascalu jsou definovány standartní procedury new (alokace) a dispose (uvolnění) pro práci s pamětí.

Na cvičení jsme probrali syntaxi a zkusili si naprogramovat jednoduchý příklad.

Při práci s dynamickou pamětí je na místě zvýšená opatrnost. Vyplatí se důsledně kontrolovat jestli ukazatele ukazují tam, kam mají. Například proto, že chyby způsobené špatnou prací s pointry se špatně hledají. Existují ale i další důvody:

Compiler compliant

Spojový seznam

Dynamickou alokaci jsme si vyzkoušeli na jednoduchém spojovém seznamu.

Programovali jsme procedury:

  1. vloz(x: integer) - vloží číslo x do seznamu
  2. vypis - vypíše celý seznam

Příklad implementace procedury vlož:

type PBox = ^TBox;
     TBox = record
             v: integer;
             next: PBox;
            end;

var pSeznam: PBox;

procedure vloz(x: integer);
var pNewBox: PBox
begin
new(pNewBox);
(pNewBox^).next := pSeznam;
pSeznam := pNewBox;
(pNewBox^).v := x;
end;

Domácí úkol

V CodExu je zadána úloha Telefonní seznam čísel za 20 bodů. Cílem je naprogramovat lineární spojový seznam.