Unterprogrammbibliothek Exsort – Sortieren mit Komfort
Exsort zeichnet sich zum einen durch die Sortiergeschwindigkeit aus. Zum anderen werden sowohl numerische als auch alphanumerische Felder auf- oder absteigend sortiert. Ein weiterer Clou: Ein zweites Feld kann abhängig vom ersten Feld mitsortiert werden.
Jeder Programmierer ärgert sich irgendwann einmal über das langsame Basic, das vor allem beim Suchen und Sortieren stört. Gute Sortierroutinen, in Assembler geschrieben, kann nicht jeder entwickeln. Viele Sort-Programme sind aber auch sehr einseitig: Entweder sortieren sie nur aufsteigend oder lediglich alphanumerische Felder. Exsort kann beides und noch mehr.
Vorteile:
Zirka zehnmal so schnell wie die schnellste Basic-Version.
Die Befehle können in jedem Basic-Programm angewendet werden.
Unterprogramme in Basic, die oft nur ein bestimmtes Feld in einer Richtung sortieren können, entfallen.
Die Erweiterung belegt keinen Basic-Speicher.
Beim Sortieren von Strings kommt es nicht zu einem zeitraubenden Garbage-Collect, da die Descriptoren vertauscht werden.
Ein zweites Feld, das Informationen über das erste Feld enthält, kann mitsortiert werden.
Das zu sortierende Feld kann numerisch oder alphanumerisch sein.
Nachteile:
Es kann nicht mit Exbasic oder Simons Basic zusammen genutzt werden.
Es kann nicht compiliert werden.
1. Befehl »so«
Syntax: so, (feldname), (anfangsindex), (endindex), (sortierungsrichtung)
Dieser Befehl sortiert ein beliebiges eindimensionales Feld innerhalb von zwei Grenzen mit einer vom Benutzer gewählten Sortierungsrichtung.
Beispiel 1:
Das Feld heißt ax$, alphanumerisch aufsteigend sortieren (von Index 100 bis Index 5000).
Befehl: so,ax$,100,5000,1 (1 = aufsteigend)
Beispiel 2:
Das Feld heißt qe%, numerisch absteigend sortieren (von Index 0 bis zu dem Index, der in der Variable »en« enthalten ist).
Befehl: so,qe%,0,en,0 (0 = absteigend)
Option: Manchmal ist es notwendig, daß Daten, die in einem zweiten Feld vorhanden sind, entsprechend dem ersten Feld sortiert werden.
Syntax: so,(feldname 1), (anfangsindex), (endindex), (sortierungsrichtung), (feldname2)
Beispiel: Das Feld fe$ soll alphanumerisch aufsteigend von Index 0 bis Index 10 sortiert werden. Die Daten in dem Realfeld »nr« sollen entsprechend dem ersten Feld sortiert werden.
Befehl: so,fe$,0,10,1,nr
Dieser Befehl durchsucht ein beliebiges eindimensionales Feld innerhalb von zwei Grenzen nach einem Element.
Beispiel: Es soll die Zahl - 12 in dem Feld rt% von Index 0 bis Index 100 gesucht werden.
Befehl: se,rt%,0,100, - 12
Wenn das Element gefunden wird, enthält die Variable »in« den jeweiligen Index. Wird das Element nicht gefunden, so enthält »in« den Wert -1.
Fehlermeldungen:
type mismatch:
Sie versuchten, einen String in einem numerischen Feld zu suchen (oder umgekehrt).
wrong index:
Beim Suchen war der Anfangsindex größer als der Endindex.
bad subscript:
Index außerhalb des zulässigen Bereiches.
only one dimension array:
Sie können nur eindimensionale Felder durchsuchen oder sortieren.
array not found:
Das Feld war nicht durch einen DIM-Befehl dimensioniert worden.
wrong array name:
Geben Sie bitte nur die ersten beiden Buchstaben des Feldnamen ein (plus % oder $ wenn nötig). Es wird dann sicher funktionieren.
wrong sorting direction error:
Sie haben einen anderen Wert als 0 oder 1 als Sortierungsrichtung angegeben.
Zu den Programmen:
Listing 1
Das Programm »Exsort data« erstellt das Maschinenprogramm aus DATA-Zeilen und speichert es als »Exsort«-Absolutprogramm auf Diskette oder Kassette. Sie können es dann jederzeit durch LOAD »Exsort«, 8,1 absolutladen. Dabei geht ein Basic-Programm nicht verloren (siehe auch Listing 2, Demo-Programm).
Listing 2
Das Programm »Exsort demo« lädt das Absolutprogramm »Exsort« nach und startet es. Danach folgt eine Demonstration der beiden Befehle.
Um »Exsort« zu laden, muß Zeile 0 des Basic-Programms lauten:
0 if k = 0 then k = 1 : load"ex-sort",8,1 (für Diskette)
0 if k = 0 then k = 1 : load"ex-sort",1,1 (für Kassette)
In Zeile 1 muß stehen:
1 sys 49400
Da die Erweiterung nur einmal geladen und gestartet werden muß, kann sie bei späteren Starts des Programms übersprungen werden.