Teil 28 „System variables“

Der C-Kurs
Antworten
Benutzeravatar
bodo
User
Beiträge: 319
Registriert: 14.02.2007, 17:21
Kontaktdaten:

Teil 28 „System variables“

Beitrag von bodo » 02.01.2011, 18:32

C für BASIC-Programmierer

Arbeiten mit dem z88dk Cross-Compiler

von Jens Sommerfeld und Bodo Wenzel

Teil 28

In Kapitel 28 erzählt uns Vickers von den „System variables“, deshalb gehen auch wir kurz darauf ein. Ansonsten schließt dieser Kurs mit diesem Teil, aber das ist nicht das Ende! Ganz im Gegenteil geht für diejenigen von euch, die vom C-Virus erfasst wurden, jetzt erst der eigentliche Spaß weiter...

Systemvariablen

Um bequem auf die Systemvariablen des ZX81 zuzugreifen, könnt ihr euch eine entsprechende Struktur (siehe letzten Teil) in eine *.h-Datei schreiben. In der folgenden Vorlage steht diese Struktur noch direkt im Quelltext, aber hier zeigen wir euch noch eine Erweiterung des z88dk. Mit „@“ und einer Zahl könnt ihr eine externe Variable an einer fixen Adresse deklarieren.

Code: Alles auswählen

#include <stdio.h>

struct {
    unsigned char ERR_NR;
    unsigned char FLAGS;
    unsigned short ERR_SP;
    unsigned short RAMTOP;
    /* und so weiter... */
} SYSVAR @ 16384;

int main(void) {
    printf("%x = %x\n", &SYSVAR.ERR_NR, SYSVAR.ERR_NR);
    printf("%x = %x\n", &SYSVAR.FLAGS, SYSVAR.FLAGS);
    printf("%x = %x\n", &SYSVAR.ERR_SP, SYSVAR.ERR_SP);
    printf("%x = %x\n", &SYSVAR.RAMTOP, SYSVAR.RAMTOP);

    return 0;
}
Weitere Standardfunktionen

Im Laufe des Kurses habt ihr ja schon einige der Funktionen der Standardbibliothek kennengelernt. Es gibt aber noch viel zu entdecken, dazu könnt ihr die diversen Headerdateien durchsehen. Nicht nur Standard-C, sondern auch das z88dk liefert euch viel Raum zum Ausprobieren.

Um eine gefundene Funktion richtig einzuordnen, lohnt sich das Lesen der zugeordneten Kommentare, das Suchen in den Beispielprogrammen des z88dk, und vor allem die Recherche im Internet oder einem guten C-Buch.

Hausaufgabe

Eine letzte Hausaufgabe wollen wir euch noch stellen, die ein typisches Problem der Informatik behandelt, das auch gern mit C bearbeitet wird. Es geht um verkettete Listen.

Unter einer Liste könnt ihr euch sicher bereits etwas vorstellen. Innerhalb eines Programms werden solche gern zur sortierten Ablage einer vorher unbestimmten Anzahl Objekte verwendet.

Natürlich können wir uns dazu ein Array anlegen, das mit sich ändernder Anzahl immer wieder per realloc() angepasst wird. Aufwendig daran sind aber auch Operationen, die irgendwo in der Mitte der Liste Objekte einfügen oder löschen. Denn der Computer muss dann ja ständig große Datenmengen hin- und herkopieren.

Eine bessere Lösung ist, jedes Objekt einzeln mit malloc() zu erzeugen und bei Bedarf mit free() wieder zu entfernen. Die eigentliche Liste entsteht, wenn zu jedem Objekt ein oder mehrere Zeiger auf seine Nachbarobjekte abgelegt werden – und genau das ist die „Verkettung“!

Um die Sache nicht zu komplex zu machen, beschränken wir uns auf eine einfach verkettete Liste, die Ganzzahlen in aufsteigender Reihenfolge aufnimmt. Wir brauchen Funktionen zum Hinzufügen von Werten (ohne Doppel zu erzeugen), zum Suchen nach vorhandenen Werten, und zum Entfernen von Werten.

Die ganze Sache soll mit einem Hauptprogramm getestet werden, das folgende Schritte ausführt. Nach jedem Schritt bzw. Teilschritt soll die ganze Liste zur Kontrolle ausgegeben werden:
  1. Suche nach 23 => kein Fund.
  2. Entfernen von 81 => da nicht vorhanden, tut sich nichts.
  3. Hinzufügen von 42, 23, und 81 => die Ausgabe nach jedem Teilschritt zeigt, dass die Liste sortiert ist.
  4. Entfernen von 42.
  5. Hinzufügen von 0 und 666. Dies ist ein Test, ob korrekt am Anfang und am Ende hinzugefügt wird.
  6. Hinzufügen von 23, 666, und 0 => keine Änderung, weil sie schon vorhanden sind.
  7. Suche nach 80 => wird nicht gefunden.
  8. Entfernen von 123 => da nicht vorhanden, tut sich nichts.
  9. Suche nach 81 => wird gefunden.
  10. Entfernen von 666, 0, 23, und 81 => am Ende ist die Liste leer.
Das war's

Wir hoffen, ihr hattet eine Menge Spaß und neue Erkenntnisse mit der Sprache C. Einige der Erfahrungen könnt ihr auch sinnvoll in BASIC-Programmen anwenden. Wir sind gespannt, was für tolle Programme entstehen!
B0D0: Real programmers do it in hex.

Antworten