Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: C++ (auch C++0x und C++11) ::  Unerwartete Endlosschleife bei while     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
dustail
Unregistrierter




Beitrag 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




Beitrag 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




Beitrag 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




Beitrag dustail Unregistrierter 14:33:48 13.02.2011   Titel:              Zitieren

schon klar, aber auch wenn ich eine 2 eingebe, müsste doch bei

C++:
cin >> a;


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
Beitrag 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




Beitrag 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




Beitrag 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




Beitrag 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.
c++.de :: C++ (auch C++0x und C++11) ::  Unerwartete Endlosschleife bei while   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




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.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.