Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

10.10.2012, 21:47

[Problem] C++ für Spieleprogrammierer Aufgabe 5.11

Hallo,


Seit ein paar Tagen bin ich dabei, das Buch "C++ für Spieleprogrammierer" zu lesen.

Nun stecke ich in Aufgabe 5.11 fest und weiß nicht weiter!



Nämlich:

C-/C++-Quelltext

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
27
void Feldsetzen()
{
    int x=0, y=0;

    do
    {
        cout << "X Koordinate:";
        cin >> x;
        if (x <= Breite/Breite-1 || x > Breite)
            cout << "\nFalsche Eingabe!" << endl;
    }while(x <= Breite/Breite-1 || x > Breite);
    
    do
    {
        cout << "Y Koordinate:";
        cin >> y;
        if (y <= Hoehe/Hoehe-1 || y > Hoehe)
            cout << "\nFalsche Eingabe!" << endl;
    }while(y <= Hoehe/Hoehe-1 || y > Hoehe);


    cout << "gewuenschter Name?(max. 10 Zeichen!):";
    cin.get (Spielfeld[x][y].chName, 9);



}




Warum wird nach dem beenden der do-while Schleife von Y unendlich oft die Schleife von X Ausgeführt? :dash:



Falls es hilft...
Hier mein Visual C++ Projekt-Ordner:
GoogleDrive:
Download(.rar)
Als Ordner



Bitte nur bei diesem Fehler helfen, Danke! (Falls andere vorhanden sind!)

BK Simon

Treue Seele

Beiträge: 151

Beruf: Student

  • Private Nachricht senden

2

10.10.2012, 22:23

Wieso rechnest du in der if - Bedingung erstmal Breite/Breite - 1 ?

Nehmen wir an die Breite ist 5.

5 / 5 = 1 - 1 = 0 ?

Wieso schreibst du nicht direkt 0 dorthin ?

--
Habe deinen Code kopiert

C-/C++-Quelltext

1
2
int Breite = 5;
int Hoehe = 5;


hinzugefügt und deine Schleifen klappen ohne weiteres.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »BK Simon« (10.10.2012, 22:32)


3

10.10.2012, 22:34

cin.get liest bis zum newline, belässt dieses aber im Buffer.
Du musst diesen also leeren: cin.ignore(cin.rdbuf()->in_avail());

Außerdem wirst du dein Programm unweigerlich crashen, wenn du für eine Koordinate 5 angibst.
"Theory is when you know something, but it doesn’t work. Practice is when something works, but you don’t know why. Programmers combine theory and practice: Nothing works and they don’t know why." - Anon

BK Simon

Treue Seele

Beiträge: 151

Beruf: Student

  • Private Nachricht senden

4

10.10.2012, 22:39

Habe bei meiner Version den Teil mit cin.get auskommentiert, da nur nach den Schleifen gefragt wurde und man nicht auf andere Probleme eingehen sollte.
Und so crasht das Programm nicht, auch wenn man 5 eingibt :)

5

10.10.2012, 22:55

Wieso rechnest du in der if - Bedingung erstmal Breite/Breite - 1 ?

Nehmen wir an die Breite ist 5.

5 / 5 = 1 - 1 = 0 ?

Wieso schreibst du nicht direkt 0 dorthin ?

--
Habe deinen Code kopiert

C-/C++-Quelltext

1
2
int Breite = 5;
int Hoehe = 5;


hinzugefügt und deine Schleifen klappen ohne weiteres.


Warum ich x/x-1 statt einer einfachen 0 genommen habe? Weiß ich auch nicht mehr...

Breite und Hoehe wurde Global mit 5 deklariert... sind also schon vorhanden.

cin.get liest bis zum newline, belässt dieses aber im Buffer.
Du musst diesen also leeren: cin.ignore(cin.rdbuf()->in_avail());

Außerdem wirst du dein Programm unweigerlich crashen, wenn du für eine Koordinate 5 angibst.


Habe ich schon erwähnt das ich absoluter Anfänger bin? Habe nämlich kein Plan was da jetzt das Problem ist . :S

Habe bei meiner Version den Teil mit cin.get auskommentiert, da nur nach den Schleifen gefragt wurde und man nicht auf andere Probleme eingehen sollte.
Und so crasht das Programm nicht, auch wenn man 5 eingibt :)


Gut! Also liegt der Fehler beim cin.get()...
Was muss ich machen um das zu beheben? Im Buch wurde auf cin.get() noch nicht wirklich eingegangen...

BK Simon

Treue Seele

Beiträge: 151

Beruf: Student

  • Private Nachricht senden

6

10.10.2012, 23:19

Da du ja nicht deinen kompletten Quellcode veröffentlich hast muss ich raten:

Ich gehe davon aus, dass du irgendwo in deinem Programm ein struct verwendest hast, in dem du ein char Array mit der größe von 10 deklariert hast.
Wenn dies der Fall ist, möchte ich dich erstmal darauf aufmerksam machen, dass deine Textausgabe:

"gewuenschter Name? (max. 10 Zeichen!):"

nicht ganz korrekt ist, da der User nur 9 Zeichen zur Verfügung hat.
Der Grund dafür ist die binäre Null, von der du hoffentlich schon gehört hast.
Aus diesem Grund schreibst du ja auch in der Zeile 23:

C-/C++-Quelltext

1
cin.get (Spielfeld[x][y].chName, 9);


und gibst die Anzahl von Zeichen die der User eingeben darf von 9 und nicht von 10 an.

Damit dein Programm funktioniert, musst du, wie Steef schon erwähnt hat cin.ignore () einsetzen und würde dann wie folgt aussehen:

C-/C++-Quelltext

1
2
3
cout << "gewuenschter Name?(max. 10 Zeichen!):";
cin.ignore ();
cin.get (Spielfeld[x][y].chName, 9);


Falls du noch nichts von cin.ingore () sowie cin.get () gehört hast musst du dich noch etwas Gedulden, da der Herr Kalista noch zu einem späteren Zeitpunkt darauf eingeht.
Vorausgesetzt, dass du diesen Teil nicht schon überlesen hast. :)

7

10.10.2012, 23:50

Vielen Dank!
Nun klappt es auch... ^^

Im Buch wurde noch nicht wirklich auf cin.get() und cin.ignore eingegangen(wird erst bei den Klassen und so weit bin ich noch nicht), weshalb ich das auch nicht mehr im Kopf hatte...

Die Binäre 0 wurde schon öfters erklärt, das hatte ich nur beim Hinweis(Textausgabe) vergessen zu berücksichtigen...

*Statt den Quellcode hatte ich aber das Projekt hochgeladen. Wollte den Thread nur nicht mit einem Ca. 200 Zeilen Code unnötig Groß machen.
Grammatik und Rechtschreibung bitte nicht unbedingt beachten... schreibe nun mit einem kleinem Handy :D

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »Fusionbreak« (11.10.2012, 00:02)


Werbeanzeige