| Autor |
Nachricht |
dustail
Unregistrierter
|
dustail Unregistrierter
14:12:22 13.02.2011 Titel: |
Unerwartete Endlosschleife bei while |
Zitieren |
Ohne lange zu Diskutieren will ich kurz und knapp mein Problem vorstellen.
(Bin noch ein C++ anfänger, doch erkenne das Problem hierbei nicht)
| C++: | 1 2 3 4 5 6 7 8 9 10 11 12 | bool a = true;
while (a == true)
{
cout << "Dient zur Übersichtlichkeit" << endl;
cin >> a;
cout << endl;
} | |
Den eigentlichen Code habe ich natürlich bisschen abgeändert, doch das Problem sieht man hier ganz genau.
Unzwar wenn ich 1 eingebe macht die while-Schleife den nächsten durchlauf, bei 0 hört sie auf. Wenn ich jedoch was anderes eingebe wie z.B. 2, dann gerate ich in eine Endlosschleife und kann mir nicht erklären warum! |
|
|
|
 |
xkc
Unregistrierter
|
xkc Unregistrierter
14:29:57 13.02.2011 Titel: |
|
Zitieren |
a ist ein bool, d.h. entweder true oder false. Dabei wird alles außer 0 zu true, weswegen die Schleife auch durchläuft, wenn du 2 eingibst. |
|
|
|
 |
Streamer
Unregistrierter
|
Streamer Unregistrierter
14:31:50 13.02.2011 Titel: |
|
Zitieren |
Dass cin >> a dann nichts mehr tut, liegt daran, dass das Fail- oder Badbit gesetzt ist (prüfen kannst du das mit cin.bad() oder cin.fail()). |
|
|
|
 |
dustail
Unregistrierter
|
dustail Unregistrierter
14:33:48 13.02.2011 Titel: |
|
Zitieren |
schon klar, aber auch wenn ich eine 2 eingebe, müsste doch bei
eine abfrage stattfinden, was jedoch nicht passiert. Ich bekomme nur eine Endlosschleife mit der ersten cout Ausgabe. |
|
|
|
 |
g0nz0
Mitglied
Benutzerprofil
Anmeldungsdatum: 26.11.2010
Beiträge: 16
|
g0nz0 Mitglied
14:34:33 13.02.2011 Titel: |
|
Zitieren |
a ist ein bool. Ein bool kann entweder true(=1) oder false(=0) sein. D.h. wenn du was anderes eingibst kommen Fehler. In deinem Fall eine Endlosschleife. Wenn du eine Schleife brauchst, die bei jeder ganzen Zahl weitermacht bis auf 0, probier doch sowas (ungetestet):
| C++: | 1 2 3 4 5 6 7 8 9 10 | int a = 1;
while (a!=0)
{
cout << "Dient zur Übersichtlichkeit" << endl;
cin >> a;
cout << endl;
} | |
Gruß |
Zuletzt bearbeitet von g0nz0 am 14:35:56 13.02.2011, insgesamt 1-mal bearbeitet |
|
 |
kjkljkl
Unregistrierter
|
kjkljkl Unregistrierter
14:35:33 13.02.2011 Titel: |
|
Zitieren |
Die Zahl 2 lässt sich nicht in ein bool pressen, da ein bool nur aus einem Bit besteht. Dieses ist entweder 1 oder 0, also wahr oder falsch.
Der Stream setzt folglich das failbit, um einen Fehler zu signalisieren. Entweder du nutzt also lieber int, anstatt bool oder du musst auf das failbit reagieren.
| C++: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | #include <iostream>
using namespace std;
int main()
{
bool a = true;
while (a == true)
{
cout << "Dient zur Übersichtlichkeit" << endl;
cin >> a;
cout << endl;
if (cin.fail())
{
a = true;
cin.clear(); // Failbit löschen
}
}
return 0;
} | |
Besser wäre es aber so:
| C++: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #include <iostream>
using namespace std;
int main()
{
int a = 1;
while (a != 0)
{
cout << "Dient zur Übersichtlichkeit" << endl;
cin >> a;
cout << endl;
}
return 0;
} | | |
|
|
|
 |
dustail
Unregistrierter
|
dustail Unregistrierter
14:39:19 13.02.2011 Titel: |
|
Zitieren |
Vielen Dank für die Antworten. Ich habe mir die cin.fail() Funktion angeschaut, schaut nützlich aus. Jedoch habe ich mich entschieden auf die int Mehtode zurückzugreifen |
|
|
|
 |
kjkljkl
Unregistrierter
|
kjkljkl Unregistrierter
14:42:16 13.02.2011 Titel: |
|
Zitieren |
Noch ein kleiner Tipp. Du kannst hier eine fußgesteurte Schleife nutzen:
| C++: | 1 2 3 4 5 6 7 8 9 10 | int a;
do
{
cout << "Dient zur Übersichtlichkeit" << endl;
cin >> a;
cout << endl;
} while (a != 0); | |
Du sparst dir nämlich so die Initialisierung der Variable a, wenn du die Bedingung erst am Ende der Schleife prüfst. |
|
|
|
 |
|
Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben. Sie können auf Beiträge in diesem Forum antworten. Sie können Ihre Beiträge in diesem Forum nicht bearbeiten. Sie können Ihre Beiträge in diesem Forum nicht löschen. Sie können an Umfragen in diesem Forum nicht mitmachen.
|
|
|
|
|