Dr. Matthias Grabert Abteilung Angewandte
Informationsverarbeitung 22. Juni 2002
Christian Ehrhardt Blatt 9
Systemnahe Software (SS 2002)
Abgabetermin 2.7.2002
ncurses ist eine Bibliothek, mit der textbasierte, bildschirmorientierte
Ausgabe auf
einem Terminal unabhängig vom Typ des Terminals realisiert werden kann.
Bildschirmorientierte Ausgabe heißt, daß jedes Zeichen auf dem
Terminal mit seinen Koordinaten angesprochen und verändert
werden kann. Eine Einführung zu ncurses gibt es auf der Manualseite
ncurses (3X) bzw. ncurses (3NCURSES). Es empfiehlt sich, diese
Manualseite und die wichtigsten zugehörigen Manualseiten zu
lesen. Dennoch hier eine kurze Zusammenfassung der wichtigsten
Funktionen:
- Alle Funktionen aus der ncurses Bibliothek zeichnen zunächst
nur auf einer internen Datenstruktur, die den Inhalt eines
Terminalfensters repräsentiert. Das Standardfenster
kann über die globale Variable stdscr angesprochen werden.
Funktionen, die kein Argument vom Typ WINDOW haben, arbeiten
auf stdscr.
- Erst ein Aufruf von refresh bewirkt, daß der aktuelle Bildschirm
so aussieht, wie stdscr. refresh spielt bei der Terminalausgabe
also eine ähnliche Rolle wie fflush bei der normalen gepufferten
Ausgabe.
- Die ncurses Bibliothek muß vor der ersten Verwendung
initialisiert werden. Dazu empfiehlt sich der Aufruf folgender
Funktionen (in dieser Reihenfolge):
- initscr();
- um die internen Datenstrukturen anzulegen. Unter
anderem wird hier stdscr initialisiert.
- cbreak();
- um ungepufferte Eingabe zu erhalten.
- noecho();
- um zu verhindern, daß eingegebene Zeichen direkt
auf dem Bildschirm erscheinen.
- nonl();
- um auch n als echtes Zeichen lesen zu können.
- intrflush(stdscr, FALSE);
- um zu vermeiden, daß der
Eingabepuffer bei einer Unterbrechung (etwa durch Ctrl-C)
geleert wird.
- keypad(stdscr, TRUE);
- um Pfeiltasten und ähnliches
einfacher lesen zu können.
- Da ncurses die Terminaleinstellungen verändert, sollte beim
Beenden des Programms endwin(); aufgerufen werden. Außerdem
ist es sinnvoll, mit flushinp(); eventuell noch nicht gelesene
aber bereits eingegebene Zeichen zu löschen. Diese Eingabe wird
sonst nach dem Beenden des Programms von der Shell interpretiert.
- Mit getmaxyx läßt sich die Größe des aktuellen Terminalfensters
bestimmen. ACHTUNG: getmaxyx ist ein Makro, das den zweiten und
dritten Parameter verändert, ohne daß Zeiger übergeben
werden müssen.
- Mit mvaddstr kann ein beliebiger Text an einer bestimmten
Position auf dem Bildschirm ausgegeben werden (erst nach refresh
sichtbar).
- Mit mvaddch kann ein beliebiger Buchstabe an einer bestimmten
Position auf dem Bildschirm ausgegeben werden. mvaddch sieht im
Gegensatz zu mvaddstr auch Möglichkeiten vor, um das Erscheinungsbild
des ausgegebenen Zeichens zu verändern.
- Mit getch () kann ein Buchstabe von der Tastatur eingelesen
werden.
- Das Koordinatensystem des Bildschirms beginnt in der linken
oberen Ecke mit den Koordinaten . Die y-Achse zeigt nach
unten(!), die x-Achse nach
rechts. getmaxyx liefert die Koordinaten des Zeichens, das
gerade nicht mehr innerhalb des sichtbaren Bildschirmbereichs liegt.
Bei allen Funktionen, die mit Koordinaten zu tun haben, kommt
zuerst die y-Koordinate und dann die x-Koordinate.
Schreibt ein Programm, das aus einer normalen Datei einen
Kalaha-Spielstand einließt. Das Einlesen sollte so gehalten
sein, daß es zur Ausgabe eines Spielstandes, wie Sie Euer
Server von Blatt 8 erzeugt, paßt. Anschließend soll der
eingelesene Spielstand mit Hilfe der ncurses-Bibliothek auf
dem Bildschirm so dargestellt werden, daß der Bildschirm dem
Spielbrett nachempfunden ist. Ein Beispiel, wie die Anzeige eines
Spielstands mit A1=5, A2=3, A3=2, A4=15, A5=0, A6=5, A7=18, B1=1,
B2=0, B3=11, B4=3, B5=3, B6=2, B7=4 und Spieler B am Zug aussehen
könnte, ist bei den Beispielen zu dieser Übungsaufgabe auf der
Homepage der Vorlesung zu finden.
Natürlich gibt es auch noch jede Menge Möglichkeiten, mit Hilfe von
Farben, Linien usw. eine noch ansprechendere Darstellung zu finden.
Zum Schluß soll ein Zug von der Tastatur eingelesen und (ebenfalls
mit Hilfe von ncurses) ausgegeben werden. Im Beispiel oben würde
es sich anbieten, den Text ``Last Move A5'' durch entsprechend zu
ersetzen. Nach einem weiteren Tastendruck soll sich das Programm
dann beenden.
Im Hinblick auf das nächste Blatt könnte es hilfreich sein, für
die beiden Aufgaben ``Einlesen eines Spielstands aus einer Datei''
und ``Darstellen eines Spielstands am Bildschirm'' je eine eigene
Funktion zu schreiben.
Wenn Euer Programm zusätzlich in der Lage ist, einen Doppelklick auf
eine Mulde als Zug zu erkennen, dann gibt es 5 Zusatzpunkte. Ein
Blick auf die Manualseite getmouse könnte hierbei helfen.
- Unter Solaris sind die Manualseiten zu ncurses im Kapitel 3X zu
finden, unter Linux im Kapitel 3NCURSES.
- Für die Mausfans: Die Funktion getch liefert nicht umsonst
einen Integer und nicht nur einen Buchstaben zurück.
- Um ein Programm, das die ncurses Bibliothek verwendet
übersetzen zu können wird die Option ``-lncurses'' benötigt.
Christian Ehrhardt
2002-06-22