005
06.12.2004, 01:26 Uhr
typecast
aka loddab (Operator)
|
So jetzt erst mal zu deinem Problem mit der Endlosschleife:
Wenn du zum Beispiel:
eingibst, dann wird das Programm (wie du schon festgestellt hast) in eine Endlosschleife gehen. Der Grund dafuer ist der, dass cin sich in einem Fehlerzustand befindet und niemals etwas anderes liest. D.h., dass m in deinem Code nie auf true gesetzt wird. Um das zu beheben musst du als allererstes die Errorflags loeschen:
Das wird aber nicht reichen, dass sich eventuell noch Zeichen im Stream befinden koennen, die muessen erst weggeschmissen werden:
C++: |
cin.ignore(INT_MAX, '\n')
|
Das ignoriert die naechsten INT_MAX Zeichen (frag mich jetzt nicht wieviele das sind. So ein int ist ganz schoen gross), bis es auf ein '\n' trifft (also das newline Zeichen). Da am Ende der Eingabe immer Enter gedrueckt wird, werden so alle Zeichen, die du eingeben hast weggeworfen.
Ich wuerde den Code noch ein wenig anders schreiben:
C++: |
do { cout<<"Wann soll die Aktivitaet beginnen?"<<endl; cout<<"Eingabe im Format Tag.Monat.Jahr: "; if(!(cin>>tg>>c>>mn>>c>>j)){ cerr<<"Ungueltige Eingabe!" << endl; cin.clear(); cin.ignore(INT_MAX, '\n'); } } while (von.setDatum(tg, mn, j);
|
Wenn du direkten Zugriff auf "von" hast, Ansonsten laesst du halt a1->setvon() einen Wert zurueckgeben, ob es geklappt hat oder nicht. setvon wuerde dann aber so aussehen:
C++: |
Aktiviataet::setvon(...) { von.setDatum(...); }
|
Aber ich kenne ja den gesammten Code nicht. Deshalb musst du entscheiden, wie du es machst. -- All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925) |