Gegen Internetzensur
Stoppt die Vorratsdatenspeicherung! Jetzt klicken & handeln!Willst du auch bei der Aktion teilnehmen? Hier findest du alle relevanten Infos und Materialien:
  • Flickr Photos

    www.flickr.com
3. Nov
Sam

TFH: PRÜ29 (Gerald Kempfer) Übung 2

Gestern war dann nach zweiwöchiger Frist die Abgabe der Aufgabe 2 im C-Labor angesagt. Ging alles erstaunlich ruhig über die Runden. Etwas verwirrt war ich nur, dass mein Prof bereits beim 2. Mal und ohne, dass wir uns sonstwie über den Weg gelaufen oder bekannt wären, mein Gesicht zum korrekten Nachnamen zuordnen konnte. (Oder anders herum) Er hat mir sogar auf die Nase zugesagt, dass ich nicht in der Vorlesung war. Hoppla …

TT3 Maske

Nachdem die Aufgabe beim letzten Mal hieß, die Eingabemasken auf dem Bildschirm auszugeben und ein rudimentäres Menüsystem zu programmieren (essentiell eine Bildschirmlösch-Print-Schleife mit “Nicht Beenden gewählt”-Probe), ging es dieses Mal darum, dem Benutzer die korrekten Eingaben abzufordern. Da das große Ziel wohl irgendeine Form von Terminverwaltung ist, wären das: Datum einlesen und verifizieren, dasselbe für die Zeit, Dauer und letztlich eine Beschreibungszeile.
Irgendwie habe ich es geschafft, die Aufgabe komplett ad absurdum zu führen und mir deshalb saftige anderthalb Wochen damit um die Ohren geschlagen, mein nicht vorhandenes Wissen über Vim, GDB und überhaupt *nix-Programmierung zu schärfen und eine variable, formatierte Eingabemaske zu produzieren. Der Weg dahin war fast schon kriminell (zwischenzeitlich war ich mir gar nicht mehr so sicher, ob ich das wirklich noch will, ob Unmengen von crashes und wenig Wissen über die erlaubten Tools) aber, verdammt, was ist das für eine Welt, in der ich damit leben muss, dass der Benutzer mir einen alphanumerisch-symbolischen Zweizeiler in das Terminal kloppt, obzwar er angehalten war, ein Datum einzugeben? (Nein, im Ernst, das ging sogar unter DOS einfach, wieso dann nicht unter dem hochgelobten Linux? Und nein, curses ist keine Alternative zu echter Handarbeit.)

Das Resultat sieht am Ende recht einfach aus: Vier exportierte Funktionen, zwei davon zur Vorbereitung von Defaultwerten; der Rest für das losgelöste printen der Maske und, natürlich, die Eingabe. Beispiele zu letzterem:

  1. char* buffer[11]; // 2-1-2-1-4, zzgl. 1 für die Nullterminierung
  2. int result = masked_input( "d.m.Y", NULL, buffer, NULL );

Dieses Bisschen erzeugt eine Eingabemaske wie die obere im Bild und kümmert sich um den Rest, wie grobe Validierung der Eingaben (keine Tage über 31, usw.) Weitere Proben (Schaltjahr usw) werden dann nach Abschluss der Eingabe ausgeführt.
Für ganz harte Fälle gibt es callback-Unterstützung

  1. int callback(char id, CallbackAction reason, char c, int pos, char* field) {
  2.     if( id == ’1′ ) {
  3.         switch(reason) {
  4.             case GETSIZE: {
  5.                 return 60; // 60 Zeichen Länge
  6.             }
  7.             case VALIDATE: {
  8.                 return 1; // Alle Zeichen erlauben
  9.             }
  10.         }
  11.     }
  12.     return 0;
  13. }
  14.  
  15. // … später dann …
  16. char* buffer[61]; // nullterminiert!
  17. int result = masked_input( "^1", NULL, buffer, callback );

Wobei hier die Validierung innerhalb des callbacks durchgeführt würde.
Mit den Defaults (hier beide Male NULL) ist das etwas schwierig: Um zu unterscheiden, was der “Benutzer” (oder der Defaultgeber) eingegeben hat und was nicht – diese Differenzierung ist etwa wichtig für die farbliche Darstellung der Maske – werden “nicht-Eingaben” mit dem ASCII-Zeichen 255 maskiert. Diesen Job übernehmen zwei unterschiedlich komplexe Hilfsfunktionen.
(Ein Beispiel für ein Default-Datum wäre etwa {255, ’1′, 255, ’2′, 255, 255, ’2′, ’0′, ’0′, ’7′, 0} für den ” 1.2 .2007″; wobei beide ausgelassenen Felder blau unterstrichen wären – Benutzereingaben sind dagegen weiß. Erkennt man auf dem Bild, wenn man genau hinsieht. Nun denn.)

Schlussendlich bin ich ganz zufrieden, auch wenn die Woche gerade gegen Ende hin etwas stressiger wurde.

Ich befürchte lediglich, dass diese Lösung zur Aufgabe weniger für jemanden geeignet ist, der gerade erst programmieren lernt, sondern eher für jemanden, der vor demselben Problem stand wie ich – ungepufferte Tastatureingabe unter Linux – oder einfach gerne zum Nachmittagstee mit Teegebäck Quellcodes liest. (Stichworte: termios, ioctl, doppelt verknüpfte Listen, Parser, Funktionszeiger und callbacks, etc.) Wer sich nicht um die Eingabe kümmert und eher daran interessiert ist, wie die Werte validiert werden oder das ganze Drumherum funktionuckelt, der ist natürlich gerne angehalten, sich das zip-verpackte gz2-geschrumpfte tar-Bündel einmal näher anzusehen.

Download: tfh-pr29-u2.zip

Die Kommentarfunktion ist geschlossen.