Hallo zusammen
Ich habe eine Frage zu einem Codebeispiel von Stroustrup.
Stroustrup verwendet einen Schleifenausdruck
while (cin).
Insgesamt schaut das so aus:
while (cin) {
Token t = get_token();
tok.push_back(t);
cout<<endl;
for (int i = 0; i<tok.size(); i++)
cout<<tok.value<<endl;
}
Das funktioniert auch so weit. Nur, dass die Schleife eben nie beendet wird. das teste ich über eine cout ausgabe nach der Schleife:
cout<<"das ist ein Test"<<endl;
Was mache ich hier falsch, warum steigt mir das Programm nicht aus der Schleife aus, wenn der cin eingelesen wurde. Z.B. 3+2*3??
Kann mir jemand helfen??
Vielen Dank und noch einen schönen Sonntag.
Boris
Frage zu while (cin)
Re: Frage zu while (cin)
Bist du dir sicher, dass das Code vom Stroustrup ist?
Das while(cin) macht schon Sinn. Es kommt hierher:
http://www.cplusplus.com/reference/iost ... or_voidpt/
Wenn cin keine gesetzten Fehlerbits enthält, gibt operator void* einen Zeiger ungleich dem Nullzeiger zurück. Das wird im while(cin) zu einem true. Wenn du also nie irgendwie einen Fehlerbit in deinem cin gesetzt bekommst, wird die Schleife auch nie enden.
Mich würde jetzt mal der originalcode von Stroustrup interessieren.
Das while(cin) macht schon Sinn. Es kommt hierher:
http://www.cplusplus.com/reference/iost ... or_voidpt/
Wenn cin keine gesetzten Fehlerbits enthält, gibt operator void* einen Zeiger ungleich dem Nullzeiger zurück. Das wird im while(cin) zu einem true. Wenn du also nie irgendwie einen Fehlerbit in deinem cin gesetzt bekommst, wird die Schleife auch nie enden.
Mich würde jetzt mal der originalcode von Stroustrup interessieren.
-
- Beiträge: 14
- Registriert: 20. Februar 2012 06:22
Re: Frage zu while (cin)
Hallo franzf
Vielen Dank erst einmal für die Antwort.
Der zuvor von mir eingestellte Code war etwas auf meine offenen Fragen hin verändert, um mir etwas
mehr die Funktionsweise anzuschauen. Nichtsdesto trotz, bleibt das Programm in der Schleife hängen
Hier einmal der original komplette Code. Dieser kommt von seiner Homepage:
http://www.stroustrup.com/Programming/P ... g-code.zip
Kapitel 6.34
Ich freue mich auf Die Antwort auf while(cin). Danke franzf
Vielen Dank erst einmal für die Antwort.
Der zuvor von mir eingestellte Code war etwas auf meine offenen Fragen hin verändert, um mir etwas
mehr die Funktionsweise anzuschauen. Nichtsdesto trotz, bleibt das Programm in der Schleife hängen
Hier einmal der original komplette Code. Dieser kommt von seiner Homepage:
http://www.stroustrup.com/Programming/P ... g-code.zip
Kapitel 6.34
Ich freue mich auf Die Antwort auf while(cin). Danke franzf
Code: Alles auswählen
#include "std_lib_facilities.h"
//------------------------------------------------------------------------------
class Token {
public:
char kind; // welche Kategorie von Token
double value; // für Zahlen: ein Wert
Token(char ch) // erstelle ein Token aus einem char
:kind(ch), value(0) { }
Token(char ch, double val) // erstelle ein Token aus einem char und einem double
:kind(ch), value(val) { }
};
//------------------------------------------------------------------------------
Token get_token(); // liest ein Token aus cin
//------------------------------------------------------------------------------
vector<Token> tok; // hier legen wir die Token ab
//------------------------------------------------------------------------------
int main()
{
while (cin) {
Token t = get_token();
tok.push_back(t);
}
// ...
//Jetzt können wir mittels einer einfachen Schleife nach der Multiplikatin suchen:
for (int i = 0; i<tok.size(); ++i) {
if (tok[i].kind=='*') { // wir haben eine Multiplikation gefunden!
double d = tok[i-1].value*tok[i+1].value;
// und nun?
}
}
}
Re: Frage zu while (cin)
So wie ich das sehe, ist das Code in einer Zwischenstufe. Stroustrup wird sicher auf die Probleme eingehen. Speziell sagt der Dateiname zur 6.3.4 "no-link" - das wird nicht linken, da eine get_token-Implementierung fehlt.
Ich hatte mir aus 6.6 das get_token geholt, und ja, das bleibt ewig in der loop, da es kein ordentliches Abbruchkriterium gibt. Einen char mit cin lesen wird eigentlich immer gehen.
Ich schlage vor, lies das Buch weiter (so was ich gehört habe ist es gut), dann wirst du sicher auf eine Lösung geführt
Ich hatte mir aus 6.6 das get_token geholt, und ja, das bleibt ewig in der loop, da es kein ordentliches Abbruchkriterium gibt. Einen char mit cin lesen wird eigentlich immer gehen.
Ich schlage vor, lies das Buch weiter (so was ich gehört habe ist es gut), dann wirst du sicher auf eine Lösung geführt
-
- Beiträge: 14
- Registriert: 20. Februar 2012 06:22
Re: Frage zu while (cin)
Vielen Dank erst einmal. Dann hat sich meine Vermutung grob bestätigt.
Ich hoffe, mich trotzdem bei Fragen hier etwas tummeln zu dürfen
Ich hoffe, mich trotzdem bei Fragen hier etwas tummeln zu dürfen