APPLICATIONSDIVERS ★ SORT-PACK (SCHNEIDER MAGAZIN) ★

Sort-Pack (Schneider Magazin)Applications Divers
★ Ce texte vous est présenté dans sa version originale ★ 
 ★ This text is presented to you in its original version ★ 
 ★ Este texto se presenta en su versión original ★ 
 ★ Dieser Text wird in seiner Originalfassung präsentiert ★ 

Wenn Sie schon einmal versucht haben, eine eigene Adreßverwaltung oder eine Schallplattenkartei zu schreiben, ist Ihnen sicher das Problem begegnet, wie sich die eingegebenen Daten sortieren lassen. Eine entsprechende Routine in Basic, selbst wenn man sie gut programmiert, benötigt ihre Zeit. Dabei dauert nicht nur das Ordnen selbst, sondern z.B. bei Strings auch die Garbage Collection so lange, daß die Wartezeit selbst bei Heimanwendungen störend auffällt.

Dieses Problem können Sie bei ”Sort-Pack” vergessen. Das Programm stellt Ihnen leistungsfähige RSX-Befehle zur Verfügung, mit denen Sie alle anfallenden Sortieraufgaben erledigen können. Die Kommandos werden zunächst einzeln aufgeführt; dann folgen Hinweise zum Eingeben des Basic-Laders und Einbinden in eigene Programme.

Die Befehle von Sort-Pack

|MOVE, anfangsadresse, zieladresse, bytezahl

Ein Block von bytezahl Bytes wird von anfangs-adresse nach zieladresse verschoben. Die Blöcke können sich überlappen. Dieser Befehl ist besonders praktisch, wenn Sie eine String-Variable mitten aus einem eindimensionalen Feld löschen möchten. Als Beispiel wollen wir ein Feld d$ (500) annehmen, das die Namen Ihrer Disketten enthält. Sie wollen nun d$ (34) löschen, weil diese Diskettenseite zerstört wurde. Bisher mußten Sie folgendes schreiben:

10 FOR i = 34 TO 499:d$ (i) = d$ (i + 1): NEXT

Jetzt können Sie mit |MOVE arbeiten (wird wesentlich schneller ausgeführt):

10 |MOVE, @d$ (34 + 1), @d$ (34), (500-34) *3

Dazu müssen Sie lediglich wissen, daß der entscheidende Teil einer String-Variablen (ihr Deskriptor) drei Byte lang ist und nur alle Deskriptoren ab d$ (i + 1) um drei Byte nach unten zu schieben sind, um d$ (i) zu löschen. Beachten Sie hier aber bitte, daß d$ (500) jetzt auf denselben String wie d$ (499) weist! Deshalb sollten Sie eine Anweisung wie d$ (500) = ”” folgen lassen. Arrays vom Integer-Typ sind entsprechend zu behandeln, jedoch ist eine Integer-Variable nur zwei Byte lang (also |MOVE, @d% (34 + 1), @d% (34), (500-34) *2). Real-Variablen umfassen fünf Byte.

|SWAP, @variable1 , @variable2, typ

Hier werden zwei Variablen vertauscht, wobei typ folgende Werte annehmen kann: 2 für Integer-Variablen, 3 für String-Variablen und 5 für Real-Variablen. Auch dazu ein Beispiel: |SWAP, @a$, @b$, 3. Es werden die Inhalte von a$ und b$ vertauscht. Bei String-Variablen entsteht keine Garbage Collection, da nur ein Tausch der Deskriptoren erfolgt. Es sind außer 2, 3 oder 5 auch andere Werte für typ möglich. Sollten Sie gerne experimentieren, so wird Sie sicher folgendes interessieren: |SWAP vertauscht zwei Speicherbereiche unintelligent. (Überlappen führt also zu verqueren Ergebnissen.) Bei typ wird nur das Low-Byte berücksichtigt; typ kann also sinnvoll nur Werte bis 255 annehmen.

|PARAM, grossklein

Dieser Befehl bezieht sich auf |SORT, |SORTIN und |COMPARE. Bei allen Vergleichen, die in ihrem Rahmen stattfinden, wird die Groß- und Kleinschreibung dann außer acht gelassen, wenn grossklein = 0 ist. Sonst wird sie (auch bei den deutschen Sonderzeichen!) berücksichtigt.

|EXTRA, @sonder$

sonder$ muß ein sieben Zeichen langer String sein. Er enthält die von Ihnen vorgesehenen Zeichen, die als deutsche Sonderzeichen interpretiert werden sollen. Sie sind in der Reihenfolge Ä,Ö,Ü,ä,ö,ü,ß anzugeben. Das sieht dann z. B. so aus:

10 sonder$ = ”][\ {}|~": |EXTRA, @sonder$ Diese Zeichentabelle wird für die Befehle |SORT, |SORTIN und |COMPARE berücksichtigt. Folgende Zeichen können natürlich nicht Sonderzeichen sein: A... Z, a... z.

|COMPARE, @a$, @b$, @result%

Die Strings a$ und b$ werden verglichen. Ist a$< = b$, erfolgt in result% die Rückgabe von Null, bei a$> b$ die von Eins. result% muß eine Integer-Variable sein; ihr ist zuvor ein Wert zuzuweisen, z.B.:

10 DEFINT a-z: result = 0:a$ = ”ich bin kleiner” :b$ =”wir sind groesser”
20 |COMPARE, @a$, @b$, @result: PRINT result: |COMPARE, @b$, @a$, @result
30 PRINT result
RUN 0 1 Ready

|SORT, @a$ (anfang), anzahl

Sortiert, beginnend bei a$ (anfang), anzahl String-Variablen. Unter Umständen werden Variablen mitgeschleift (s. |ACCOMPANY). Beim Ordnen finden

die Umlaute nach DIN 5007 Berücksichtigung. Sie werden also zu Ae, Oe usw. aufgelöst.

lACCOMPANY < Variablen- und Typliste >

Diesen Befehl haben Sie sicher bei vielen RSX-Pa-keten, die sich mit dem Sortieren befassen, vermißt. Er erlaubt es, bis zu 16 eindimensionale Variablenfelder beliebigen Typs beim Ordnen ”mitzuschleifen”. Wenn also beim Sortieren zwei Strings des betreffenden Feldes vertauscht werden, ist dies auch für die entsprechenden Elemente in den angemeldeten Arrays der Fall. Dazu gleich ein Beispiel:

10 DEFINT a-z
20 DIM a$ (100), b (100), c (100), d$ (100), e! (100)
30 FOR i = 0 TO 100
40 FOR j =1 TO 10
50 a$ (i) = a$ (1) + CHR$ (65 + RND *26) : d$ (i) = d$ (i) + chr$ (65 + RND *26)
60 NEXT j
70 b (i) = INT (RND*30000) :c (i) =INT (RND*30000) :e! (i) =RND* 2000000
80 NEXT i
90 |ACCOMPANY, @b (0), 2, @c (0), 2, @d$ (0), 3,@e! (0), 5
100 FOR i =0 TO 100: PRINT a$ (i); b (i); c (i); d$ (i); e! (i): NEXT
110 |SORT, @a$ (0), 101: REM Von 0 bis 100 sind es 101 Elemente
120 FOR i = 0 TO 100: PRINT a$ (i); b (i); c (i); d$(1); e! (i): NEXT

Die Variablen- und Typliste ist folgendermaßen aufgebaut: @v1 (a), typ < , @v2 (a), typ < , @v3 (a), typ < . . . > > >

Für typ gilt das unter |SWAP Gesagte.

|ACCOMPANY ohne Variablen- und Typliste löscht die bisher benutzte Mitschleiftabelle. Es sind dann für den |SORT-Befehl keine Variablen mehr zum Mitschleifen angemeldet.

|SORTIN, @a$ (anfang), anzahl, @b$. @stelle%

Der String b$ wird in das Feld a$ () sortiert. Dieses muß groß genug sein, damit b$ noch zusätzlich Aufnahme finden kann, und außerdem zuvor schon geordnet sein. Der |ACCOMPANY-Befehl wird bei |SORTIN nicht beachtet! In stelle%, einer Integer-Variablen, der Sie vorher einen Wert zugewiesen haben müssen, wird allerdings zurückgemeldet, an welcher Stelle b$ einsortiert wurde. Dabei ist a$ (anfang) die Stelle Null. Auch dazu ein Beispiel:

10 DIM a$ (4)
20 a$ (0) = "erster”: a$(1) = ”ich bin Nr. zwei”: a$(2) = ”ich drei”: a$(3) = "vierter”
30 stelle% = 0: b$ = ”Mal gucken, wo ich lande”
40 |SORTIN, @a$(0), 4, @b$, @stelle%
50 PRINT stelle%
RUN
3
Ready
PRINT a$ (3)

Mal gucken, wo ich lande Ready

Eintipphilfe und Einbinden in eigene Programme

Damit Sie ”Sort-Pack” benutzen können, ist zunächst der DATA-Lader abzutippen. Bevor Sie ihn starten, speichern Sie das Programm bitte ab. Schieben Sie die Diskette ein, auf der ”Sort-Pack” abgelegt werden soll, und starten Sie den DATA-Lader. Wenn alles richtig gemacht wurde, müßte das Laufwerk mit seiner Arbeit beginnen und hinterher SORT.RSX im Catalog erscheinen.

SORT.RSX liegt ab &8A00 im Speicher und wird mit CALL &8A00 aktiviert. ”Sort-Pack” ist &479 Byte lang. Oberhalb der Befehlserweiterung finden noch der Outputbuffer und ein kompletter selbstdefinierter Zeichensatz Platz (daher die ziemlich niedrige Speicheradresse). Die erste Zeile in einem Ihrer Programme könnte also so aussehen:

10 SYMBOL AFTER 256: OPENOUT'd”: MEMORY HIMEM-1: CLOSEOUT: MEMORY &89FF: LOAD ”Sort.rsx”: CALL&8A00: SYMBOL AFTER beliebig

Achten Sie bei der Anwendung dieser Erweiterung ganz besonders beim |MOVE-Befehl darauf, keine unsinnigen Werte als Parameter zu übergeben. |MOVE verschiebt nämlich alles an jeden Ort, auch in die Bereiche des Betriebssystems. Wozu das dann führt, wissen Sie sicherlich aus eigener leidvoller Erfahrung.

Vorsicht ist auch beim MID$-Befehl auf der linken Seite einer Zuweisung geboten! Das gilt insbesondere für |MOVE und |SORTIN. Bei letzterem Befehl wird nämlich der String-Deskriptor der einzusortierenden Variablen b$ an die richtige Stelle kopiert. Wenn Sie jetzt b$ durch MID$ (b$, 1, LEN (b$) )= "irgendwas” abwandeln, ändern Sie damit gleichzeitig den Inhalt der Variablen a$ (stelle). Abhilfe schafft hier eine direkte Zuweisung, also z.B. b$ = bevor Sie b$ weiter manipulieren. Eine solche Zuweisung bewirkt die Anlage eines neuen Strings; außerdem wird die Adresse im Deskriptor von b$ geändert, so daß der von b$ und der von a$ (stelle) auf verschiedene Strings weisen.

Sollte ”Sort-Pack” unerwartete Ergebnisse liefern, hier noch ein Tip zur Fehlersuche. Schauen Sie genau nach, ob Sie Variablen des richtigen Typs verwendet haben. Gelegentlich werden Integer-Variablen gefordert, die durch ein angehängtes %-Zeichen gekennzeichnet sind. Vor allen Dingen müssen Sie den Klammeraffen (@) immer dort verwenden, wo er vorgesehen ist.

Thomas Naumann, Schneider Magazin

★ PUBLISHER: Schneider Magazin
★ YEARE: 1987 , 1988
★ CONFIG: 64K + AMSDOS
★ LANGUAGE:
★ LiCENCE: LISTING
★ AUTHOR: Thomas Naumann
 

★ AMSTRAD CPC ★ DOWNLOAD ★

Type-in/Listings:
» RSX-Sort-Pack    (Schneider  Magazin)    GERMANDATE: 2020-06-07
DL: 169
TYPE: ZIP
SiZE: 4Ko
NOTE: 40 Cyls
.HFE: Χ

» RSX-Sort-Pack    (Schneider  Magazin)    LISTING    GERMANDATE: 2021-02-02
DL: 183
TYPE: PDF
SiZE: 902Ko
NOTE: 6 pages/PDFlib v1.6

★ AMSTRAD CPC ★ A voir aussi sur CPCrulez , les sujets suivants pourront vous intéresser...

Lien(s):
» Applications » Alphabetical Sorting (Amstrad Computer User)
» Applications » Sort-Flo (Happy Computer)
» Applications » Machine Code Shell Sort (Computing with the Amstrad)
» Applications » Selection Sort (Amstrad Computer User)
» Applications » Selection Sort (Computing with the Amstrad)
» Applications » Dirsort (CPC Amstrad International)
Je participe au site:
» Vous avez des infos personnel, des fichiers que nous ne possédons pas concernent ce programme ?
» Vous avez remarqué une erreur dans ce texte ?
» Aidez-nous à améliorer cette page : en nous contactant via le forum ou par email.

CPCrulez[Content Management System] v8.7-desktop/c
Page créée en 480 millisecondes et consultée 862 fois

L'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent  du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko.