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
24. Jan
Fre

Der Blog ist auf Eis. Für die Entwicklergemeinde geht’s weiter auf widemeadows.de.

Da ich nicht mehr sonderlich viel gebloggt habe, sieht es Foto- und Gedankentechnisch dort drüben etwas mau aus. Wisster Bescheid.

21. Jan
Mon

Damit wären dann die letzten beiden Übungen auch fertig. Aber dieses Mal ohne Bild und alles – ich hab die Schnauze nämlich nach 10 Stunden des (teils etwas sinnlosen) herumhackens gehörig voll. :/

Übung 6

  • Einfach verkettete Listen statt statischem Array (sind hier zwar doppelt verkettet, werden aber nur einfach genutzt)
  • InsertionSort
  • die üblichen Bugfixes

Der Download: tfh-pr29-u6.zip.
Nachtrag: Hab die Datei am 26.01.08 noch mal hochgeladen; Sind jetzt ebenfalls ein paar Bugfixes drin.

Übung 7

  • Suchfunktion basierend auf einer binären Suche
  • und … die üblichen Bugfixes.

Der Download: tfh-pr29-u7.zip.
Nachtrag: Hab die Datei am 26.01.08 noch mal hochgeladen; Sind jetzt ein paar Bugfixes drin.

Aus beiden hätte man noch sehr viel mehr herauskitzeln können, aber irgendwann ist es auch wirklich mal genug.

Zumal mein Frühstück heute aus Smarties und mein Mittagessen aus Waffeln bestand. Zum Abendbrot gab es dann eine Vierteldose Thunfisch. (Ziemlich kurz nach dem Mittagessen um 17 Uhr)
Mit anderen Worten: Ich hab Knast wie Sau und werde genau das jetzt kompensieren. Und zwar durch eine ausgedehnte Fressorgie.

Sag goodbye zu deinem Pupsleben, Kühlschrankinhalt.

29. Nov
Don

Screenshot aus dem Hauptmenü:

TFH: PRÜ29 (Gerald Kempfer) Übung 4 und 5 - Screenshot 1

Screenshot des Untermenüs der Terminübersicht:

TFH: PRÜ29 (Gerald Kempfer) Übung 4 und 5 - Screenshot 2

Die Änderungen zur letzten Version:

  • Bearbeiten und Löschen von Einträgen. (Aufgabe 4)
  • Sortieren der Einträge via Quicksort mit Callbacks. (Aufgabe 5)

Die Schönheitsoperationen wie folgt:

  • Die Menüs werden nun weitestgehend über die Pfeiltasten gesteuert.
  • Die Terminliste ist blätterbar und besitzt ein terminspezifisches Untermenü; Bei Aufruf des Löschen-/Bearbeiten-Punktes vom Hauptmenü aus wird die Terminliste zum Auswählen angezeigt.
  • Der zuletzt gewählte Menüpunkt wird bei einer Rückkehr in das Menü vorgewählt.
  • Spezialisierung der Menüfunktion auf Ja-/Nein-Fragen hinzugefügt.
  • Weitere Hilfsfunktionen für das ungepufferte Einlesen von Zeichen über die Tastatur; Speziell in Bezug auf Menünavigation.
  • Quicksort hat Median of Three-Partitionierung.
  • Fehler beim Speichern der Dateien behoben.
  • Debug-Hilfsmenü übernimmt Funktionen zum Mischen und rasieren von Einträgen.

Nachtrag: Abgegeben: Erster. Yay! :mrgreen:

Der Download: tfh-pr29-u4u5.zip.

16. Nov
Fre

Termintwister 3000 Übung 3

Mal wieder nicht viel neues im rhetorischen Westen; Die Aufgabe: Speichern und Laden von Dateien. Hier gelöst über einen Parser, der zumindest halbwegs in der Lage ist, Fehler abzufangen. Inkorrekte Werte werden nicht willkürlich korrigiert (ist vielleicht auch im Sinne des Endnutzers), dafür aber stillschweigend übergangen. (Ist vermutlich nicht wirklich im Sinne des Endnutzers.)
Und sonst: Unterstützung für zukünftige Dateiversionen; Dafür fehlender Test auf ausgelassene Datenfelder – vielleicht in der nächsten Version; Mal sehen.
Zwei, drei kleine Fehler korrigiert gegenüber der letzten Version (insbesondere der herrliche 24:60 Uhr-Bug) und das war’s auch schon.

Hier der Download: tfh-pr29-u3.zip. Whatever. 😉

3. Nov
Sam

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