Inhaltsverzeichnis
3.1. Entwurf der Schnittstelle
Algorithmen
Die Algorithmen aus [1] wurden für Borland Pascal unter MS-DOS entwickelt. Bei der Übernahme in dieses Projekt sind nur geringfügige Änderungen erforderlich:
Der Algorithmus zum Ableiten von MTen aus Ketten muss zusätzlich um neue Funktionalität ergänzt werden; nämlich für den Fall, dass die Analyse der Basiskette gefordert ist:
Die konkrete Implementierung dieser Ergänzungen ist im Quelltext der Bibliothek (Seiten C 9 bis C 13) zu sehen.
Daten
Die Typenkatalog-Dateien werden von [1] übernommen, allerdings ist auch hier eine Änderung angebracht. Die besondere Struktur dieser Kataloge war aufgrund der Beschränkungen des Betriebssystems entstanden, denn unter MS-DOS konnte eine 2 Megabyte große Datei nicht ohne Weiteres komplett in den Hauptspeicher geladen werden. Unter Win32 ist das problemlos möglich; bei einer heute üblichen Speicherausstattung können sogar alle vorhandenen Kataloge gleichzeitig im Hauptspeicher liegen, ohne übermäßig Ressourcen zu verschwenden. Explizites Verschieben von Daten zwischen Datenträger und Hauptspeicher ist überdies auch gar nicht mehr so relevant, da moderne Betriebssysteme diese Zuordnung nach eigenem Ermessen treffen (Festplattencache, Virtueller Speicher).
Eine besondere Strukturierung der Kataloge ist deshalb nicht mehr notwendig. Im Gegenteil: sie behindert eine direkte Indizierung der Codes und verkompliziert außerdem die schnelle binäre Suche nach ihnen. Die Strukturierung der Kataloge wird deshalb entfernt, d.h. nach dem unveränderten Dateikopf folgen nur noch die aufsteigend sortierten Typencodes.
Zum Zugriff auf die Kataloge wird das Feld Kat verwendet, in das die Typencodes aus einer Datei geladen werden. Die Suche nach einer Katalognummer besteht dann einfach darin, auf den betreffenden Index zuzugreifen. Die Suche nach einem Code kann binär erfolgen, da die Codes sortiert vorliegen:
lo:=0; hi:=KatLaenge-1; repeat Nummer:=(lo+hi) div 2; if Kat[Nummer]<Code then lo:=Nummer+1 else hi:=Nummer-1 until (Kat[Nummer]=Code) or (lo>hi); |
Ist nach dem Durchlauf Kat[Nummer]<>Code, dann ist der gesuchte Typencode nicht im Katalog enthalten.
Die Bibliothek muss nach dem Design der Schnittstelle selbständig alle Kataloge verwalten können. Die Variable Kat wird deshalb noch um zwei Dimensionen erweitert: die Anzahl der nicht vertauschbaren Glieder (0 für Ketten, 1 für AGn) sowie die Anzahl der Glieder. Da die Kataloge unterschiedlich groß sind und außerdem kaum alle gleichzeitig benötigt werden, sollte der Speicherplatz für einen einzelnen Katalog bei Bedarf in der benötigten Größe dynamisch zugewiesen und später wieder frei gegeben werden:
type List=array[0..maxKatLaenge-1] of int64; var Kat: array[0..1,4..14] of ^List; {Typencodes aus Katalogen, erster Index: 0=Ketten 1=Assur-Grupen, zweiter Index: Anzahl der Glieder} KatLaenge: array[0..1,4..14] of integer; {zugehörige Anzahl der Typen} |