Programme mit dynamischen  Datenstrukturen

Statische Variablen

Im Vereinbarungsteil  eines Programms sind u.a. Variablenvereinbarungen platziert., d. h. ihr einen Namen zu geben und einen Typ zuzuordnen. Unter Beachtung der Gültigkeitsbereiches ist diese Variable unter diesem Namen nutzbar. Beim Compilieren wird jeder dieser Variablen  aus dem Variablenvereinbarungsteil des Hauptprogramms typspezifisch Speicherplatz zugewiesen. Diese Variablen heißen statische Variablen, da diese Speicherplatzzuweisung fest und unveränderlich ist.

Dynamische Variablen

Im Unterschied zu statischen Variablen werden dynamische Variablen im Programm nicht explizit vereinbart, beim Programmieren ist noch nicht klar, ob und wie viele dieser Variablen benötigt werden. Das entscheidet sich erst zur Laufzeit des Programms, meist in Abhängigkeit von Eingabedaten.

Vorgehensweise

Zeigertyp

Erzeugen von dynamischen Variablen

Der Aufruf der Standardprozedur NEW bewirkt, dass in einem vom Compiler verwalteten Freispeicherbereich der Speicherplatz entsprechend dem Typ reserviert und die Adresse dieses Speicherplatzes z. B. in p abgespeichert wird : NEW (p) Bei einem erneutem Aufruf NEW (p) geht der Wirkungsablauf ebenso vonstatten. Daraus folgt, dass in p der Zeiger zur zuerst erzeugten dynamischen Variablen überspeichert wird. Damit existiert die zuerst erzeugte dynamische Variable noch, aber zu ihr kann nicht mehr  zugegriffen werden.

Solange der Zugriff zu einer dynamischen Variablen benötigt wird, muss für sie eine zugehörige Zeigervariablen existieren.

Es ist darauf zu achten, dass nicht mehr benötigte Variablen nicht den Freispeicherbereich unnötig füllen.

Wiederfreigabe

Wird eine Variable nicht mehr benötigt, dann gibt es die Möglichkeit, den durch sie belegten Speicherplatz wieder zur Disposition (Erzeugen anderer dynamischen Variablen) freizugeben. Dafür ist der Syntax DISPOSE vorgesehen

z. B. DISPOSE(p) bewirkt, dass der Speicherplatz, der auf p zeigt, in der Länge entsprechend dem Typ, zur weiteren Verwendung freigegeben wird. Mit ihnen wird nicht nur genau eine dynamische Variable freigegeben, sondern der Speicherbereich, der ab einer bestimmten dynamischen Variablen durch NEW- Aufrufe belegt wurde.

program DynVar1;
uses crt;
var
  name_1 : string;          {statische Variable}
  name_2 : ^string;         {Reserviert zur Compilierzeit Platz für einen Zeiger}
  name_3 : ^string;         {Im Beispiel weiß man durch die Angabe var p:^string[20], 
  				       dass von der Anfangsadresse an
                                21 Bytes für die Daten reserviert wurden.}
begin
  clrscr;
  name_1 := 'Max';
  writeln(name_1);           {Ausgabe  Max}
  readln;
  new(name_2);               {Reserviert zur Laufzeit Platz auf dem Heap für einen String}
                             {und gibt den Zeiger darauf (die Adresse) in name_2 zurück}
  name_2^ := 'Moritz';       {Weist der dynamischen Variablen einen Wert zu.}
  writeln(name_2^);          {Ausgabe  Moritz}{Gibt den Wert der dynamischen Variablen aus.}
  readln;
  name_2^ :='Max und ' + name_2^;
  writeln(name_2^);          {Ausgabe  Max und Moritz}
  readln;
{***}
  name_3^ := 'Meister Lampe';
  writeln(name_3^);          {Ausgabe  Meister Lampe}
  readln;
  name_2^ := name_3^;
  writeln(name_2^);          {Ausgabe  Meister Lampe}
  writeln(name_3^);          {Ausgabe  Meister Lampe}
  readln;
  name_3^ := 'Böse Buben';
  writeln(name_3^);          {Ausgabe  Böse Buben}
  readln;
  dispose(name_2);	          {Gibt den reservierten Speicherplatz auf dem Heap wieder frei, }
                             {andere dynamische Variablen ihn wieder nutzen können.}
  dispose(name_3);           {Hier kommt Fehlermeldung:}
                             {Invalid Pointer operation }
  readln;
end.
Bemerkung: Mit F7 bricht das Programm nach Ausgabe "Max und Moritz" ab.
Korrektur {***}    new(name_3);  fehlt 
Modellhafte Erläuterung   (BLAU  -- STACK) alles andere im HEAP
Speicherbelegung bis name_2^ := 'Moritz'; 
name_1 (besetzt) für Name_2 reserviert  4 für Name_3 reserviert   reserviert
       
       
       

Speicherbelegung ab  name_2^ := 'Moritz'; 

Max    (besetzt) für Name_2 reserviert  4 für Name_3 reserviert   Moritz
       
       
       

Speicherbelegung ab  name_2^ :='Max und ' + name_2^;

Max    (besetzt) für Name_2 reserviert  4 für Name_3 reserviert  5 Max und  Moritz
reserviert      
       
       

Speicherbelegung ab  name_3^ := 'Meister Lampe';

Max    (besetzt) für Name_2 reserviert  4 für Name_3 reserviert  5 Max und  Moritz
Meister  Lampe      
       
       

usw.