Programmiersprache Pascal

Gepackte Datentypen

Das Schlüsselwort
  PACKED
kann im Zusammenhang mit strukturierten Datentypen verwendet werden.
Dies betrifft PACKED erlaubt dem Compiler, Code zu generieren, der für eine kompakte, speichersparende Ablage von Daten sorgt: Die Daten dürfen gepackt gespeichert werden.
Eine gepackte Speicherung kann zu Lasten der Abarbeitungsgeschwindigkeit und eventuell der Programmgröße gehen.
Darüber hinaus hat PACKED laut Sprachstandard keine funktionellen Auswirkungen.

Der Sprachstandard überläßt es den jeweiligen Pascal-Systemen, ob bzw. wie sie Daten packen. Hier kann es von System zu System wesentliche Unterschiede geben, die jedoch für die Programmlogik nicht relevant sind.
Bei einer Reihe von Systemen beeinflußt PACKED die interne Ablage der Daten nicht.
Ob dies nun bedeutet, daß immer gepackt oder immer ungepackt oder irgendein Kompromißverfahren angewendet wird, muß der jeweiligen Systembeschreibung entnommen werden.

Beispiel:

  VAR b : PACKED ARRAY[1..1000, 1..1000] OF BOOLEAN;
Als Werte vom Typ BOOLEAN kommen nur TRUE und FALSE in Frage, zu deren Unterscheidung ein einziges Bit genügt. Typisch ist jedoch die Zuordnung von mindestens einem Byte (meist 2 oder 4 Byte) zu einer Variable vom Typ BOOLEAN.
Durch Packen könnte im konkreten Fall - abhängig vom jeweiligen Pascal-System - sehr viel Speicherplatz gespart.

Turbo Pascal, Delphi

PACKED hat auf den erzeugten Code keine Auswirkung: Es erfolgt immer eine kompakte Abspeicherung.

Prozeduren zum Packen bzw. Entpacken

Packen

  Pack(VAR u: ARRAY[indextyp1] OF typ;
       i: indextyp1;
       VAR p: PACKKED ARRAY[indextyp2] OF typ);
Beginnend mit der i-ten Komponente werden die Komponenten des Arrays u in das Array p kopiert und dabei gepackt.
indextyp2 muß so gewählt sein, daß alle Komponenten von u (ab der i-ten Komponente) in p untergebracht werden können.

Entpacken

  Unpack(VAR p: PACKKED ARRAY[indextyp1] OF typ;
         VAR u: ARRAY[indextyp2] OF typ;
         i: indextyp2);
Beginnend mit der i-ten Komponente werden die Komponenten des Arrays p in das Array u kopiert und dabei entpackt.
indextyp2 muß so gewählt sein, daß alle Komponenten von p in u (ab der Position i) untergebracht werden können.

Systeme, bei denen PACKED ohne Auswirkung auf den generierten Programmcode bleibt, verzichten mitunter darauf, die Unterprogramme Pack und Unpack anzubieten.
Andere Systeme stellen die Unterprogramme aus Portabilitätsgründen zur Verfügung, ihr Aufruf bleibt jedoch ohne Folgen.

Turbo Pascal, Delphi

Die Prozeduren Pack und Unpack stehen nicht zur Verfügung.
Laut Sprachbeschreibung wird automatisch immer gepackt.


Bemerkung:
Im Zusammenhang mit ARRAY[...] OF CHAR kommt dem Schlüsselwort PACKED eine spezielle Bedeutung zu:
Beispiel:

  VAR s1 : ARRAY[1..4] OF CHAR;
      s2 : PACKED ARRAY[1..4] OF CHAR;

  s1[1] := 'T'; s2[2] := 'e'; s3[3] := 'x'; s4[4] := 't';
  s2 := 'Text';
Während bei dem "normalen" Array s1 eine Wertzuweisung nur komponentenweise, d.h. hier zeichenweise, erfolgen darf, kann dem gepackten Array s2 ein Zeichenketten-Literal zugewiesen werden.



P. Böhme, 23.07.1996