ctime und Passwortabfrage
-
Hallo zusammen,
in meinem Lehrbuch finde ich folgenden Code:#include <iostream> #include <iomanip> //Stringformatierungen mit Parameter #include <string> #include <ctime> using namespace std; long zeitdiff(void); static string geheimwort = "ISUS"; static long maxanzahl = 3, maxzeit = 60; bool getPassword() { bool ok_flag = false; string wort; int anzahl = 0, zeit = 0; zeitdiff(); while(ok_flag != true && ++anzahl <= maxanzahl) { cout << "\n\nGeben Sie das Passwort ein: "; cin.sync(); cin >> setw(20) >> wort; zeit += zeitdiff(); if(zeit >= maxzeit) break; if(wort != geheimwort) cout << "Passwort ungültig!" << endl; else ok_flag = true; } return ok_flag; } time_t zeitdiff() { static long sek = 0; time_t altsek = sek; time(&sek); return (sek - altsek) }Nun lässt sich dieser Code aber nicht kompilieren. Zum einen verwirrt mich die Deklaration des Prototyps, da dieser einen long Wert zurückgibt, doch die Funktion eigentlich was anderes machen soll.
Nun frage ich mich folgendes:
Ist es mit einer solchen kurzen Funktion möglich, eine Stoppfunktion einzurichten? Hier soll die Passwortabfrage nämlich maximal für 30 Sekunden zulässig sein.
Muss hier cin.sync() stehen? Ist das absolut notwendig? Ich sehe keinen Unterschied.
Herzlichen Dank
lg, freakC++
-
Ja, sehr zweifelhafter Code...
> static string geheimwort = "ISUS";
static ist unnötig. Da die Variable eh im globalen Namensraum definiert wurde liegt sie nun im statischen Speicher bis das Programm beendet ist. Schlechtes Design ist es allemal.
> da dieser einen long Wert zurückgibt,
Ja, das ist auch fatal. Der Autor geht davon aus, dass time_t und long (wie groß long auch immer sein mag) gleich groß sind. Bei mir ist es z.B. so definiert:
typedef __time64_t time_t; /* time value */ typedef __int64 __time64_t; /* 64-bit time value */Woanders kann es aber ganz anders sein. Bei mir entspricht time_t nicht long.
> Muss hier cin.sync() stehen?
Das Thema hatten wir hier erst (bzgl. flushen von std::istream), mal braucht mans, mal nicht. Der Standard drückt das leider nur Salopp aus und sync() arbeitet auf verschiedenen OSses leider unterschiedlich.

So kompiliert der Code auf jeden Fall (wenn auch in einem sehr C-artigem Design)
#include <iostream> #include <iomanip> //Stringformatierungen mit Parameter #include <string> #include <ctime> using namespace std; time_t zeitdiff(); string geheimwort = "ISUS"; long maxanzahl = 3; time_t maxzeit = 60; bool getPassword() { bool ok_flag = false; string wort; int anzahl = 0; time_t zeit = 0; zeitdiff(); while(ok_flag != true && ++anzahl <= maxanzahl) { cout << "\n\nGeben Sie das Passwort ein: "; cin.sync(); cin >> setw(20) >> wort; zeit += zeitdiff(); if(zeit >= maxzeit) break; if(wort != geheimwort) cout << "Passwort ungültig!" << endl; else ok_flag = true; } return ok_flag; } time_t zeitdiff() { static time_t sek = 0; time_t altsek = sek; time(&sek); return (sek - altsek); } int main() { cout << boolalpha << getPassword(); }> Ist es mit einer solchen kurzen Funktion möglich, eine Stoppfunktion einzurichten?
Ja, nur kann sie natürlich nicht std::cin beim Einlesen abbrechen (da synchrones I/O).
Ich rate dir zu einem neuen Lehrbuch!
-
Ich bin gerade mit dem gleichen Buch beschäftigt und mag es bisher sehr gern.
Ad aCTa schrieb:
Ja, sehr zweifelhafter Code...
> static string geheimwort = "ISUS";
static ist unnötig. Da die Variable eh im globalen Namensraum definiert wurde liegt sie nun im statischen Speicher bis das Programm beendet ist. Schlechtes Design ist es allemal.
(...)
Mein Buch schrieb:
Im Gegensatz zu globalen Objekten wird der Name eines statischen Objekts dem Linker nicht bekannt gegeben. Dadurch ergibt sich sein "privater" Charakter in einem Modul.
Hier sollte, glaube ich, einfach eine Feinheit beschrieben werden.
Edit: Wurde hier auch schonmal thematisiert.
-
Hallo,
vielen Dank für die Erklärung. Eigentlich bin ich mit dem Buch sehr zufrieden, da es sehr gut aufgebaut ist und sehr viel Beispielcode biete. Dennoch sind immer wieder Codeschnipsel dazwischen, mti denen ich nicht einverstanden bin und dann euch zeige, damit ihr da mal drüber schaut ;). Mich hat vor allem das Gleichsetzen von long unt time_t verwirrt. Aber Du hast es mir ja nun eklärt.Bis dann
lg, freakC++