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

Prigresh

Frischling

  • »Prigresh« ist der Autor dieses Themas

Beiträge: 5

Beruf: Schüler

  • Private Nachricht senden

1

22.01.2014, 19:29

[C++] Einsteiger Problem: Hilfe bei mein Programm (ungewollte Endlosschleife :S)

Halli hallo,
ich bin hier ganz neu und wende mich mit ein Problem an euch, bei den ich nicht weiter komme :S
Ich hab vor ca. 6 Tagen angefangen C++ zu lernen. Hab mir dazu das Buch "C++ FÜR SPIELE -PROGRAMMIERER" geholt. Nun bin ich gerade in Kapitel 5 (Arrays und Strukturen).


Nun lese ich mir immer die Kapitel Step4Step durch und versuche das gelernte anzuwenden und durch eigene Sachen zu festigen.
Nun habe ich ein Programm geschrieben, dass eigentlich folgendes machen soll:
1. Man wählt eine Klasse mit den Zahlen 1-3 aus.
2. Man wählt ein maximal 10 Zeichen langen Namen.
3. Man erhält für die Klasse die typischen Werte


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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include <iostream>


using namespace std;

int main()
{
    // Variablen zum Kontrollieren der Schleifen
    int ende;
    int iEnde;

    // Variablen 
    bool PLAYER_RIGHT_CLASS_CHOSE = false;
    int PLAYER_CLASS;

    // Struktur für die Eigenschaften der Klasse des Spielers
    struct PLAYER_CHOSE
    {
        char CLASS_NAME[11];
        int CLASS;
        int LIFE;
        int MANA;
        int RAGE;
        int STRENGTH;
        int INTELEGENCE;
        int AGILITY;
    };
    // Zuweisung der Struktur für die "Variable" PAYER
    PLAYER_CHOSE PLAYER;
    do
    {
        iEnde = 0;
        do
        {
            // Klassenwahl
            cout << "Bitte wähle eine Klasse: " << endl << "1. Magier" << endl << "2. Krieger" << endl << "3. Schurke" << endl;
            cin >> PLAYER.CLASS;
            // Namenswahl
            cout << endl << "Bitte wähle gibt dein Namen ein: " << endl;
            cin.get (PLAYER.CLASS_NAME, 10);
            // Überprüfung einer gültigen Klassenwahl
            if (PLAYER.CLASS == 1 || PLAYER.CLASS == 2 || PLAYER.CLASS == 3)
            {
                PLAYER_CLASS = PLAYER.CLASS;
                PLAYER_RIGHT_CLASS_CHOSE=true;
            }else
            {
                cout << "Bitte wähle eine gültige Klasse" << endl;
            }
        } while (PLAYER_RIGHT_CLASS_CHOSE == false);

            PLAYER_CHOSE CLASS_CHOSE_FUNKTION(); // Zuweisung der Klassenwerte für die entsprechende Klasse
            {
                if (PLAYER.CLASS == 1) // Klasse Magier
                {
                    PLAYER.AGILITY = 0;
                    PLAYER.INTELEGENCE = 100;
                    PLAYER.LIFE = 80;
                    PLAYER.MANA = 200;
                    PLAYER.STRENGTH = 0;
                    PLAYER.RAGE = 0;
                }else if (PLAYER.CLASS == 2)  // Klasse Krieger
                {
                    PLAYER.AGILITY = 0;
                    PLAYER.INTELEGENCE = 0;
                    PLAYER.LIFE = 120;
                    PLAYER.MANA = 0;
                    PLAYER.STRENGTH = 100;
                    PLAYER.RAGE = 100;
                }else // Klasse Schurke
                {
                    PLAYER.AGILITY = 100;
                    PLAYER.INTELEGENCE = 0;
                    PLAYER.LIFE = 100;
                    PLAYER.MANA = 0;
                    PLAYER.STRENGTH = 0;
                    PLAYER.RAGE = 0;
                }
            }

        cout << endl << "Der Charackter: " << PLAYER.CLASS_NAME << endl << "Charackter Werte" << endl << "_______________________________" << endl << endl << "Ressourcen:"<< endl << "Leben: " << PLAYER.LIFE << endl << "Wut: " << PLAYER.RAGE << endl << "Mana: " << PLAYER.MANA << endl << endl <<"Fähigkeitswerte:" << endl << "Beweglichkeit: " << PLAYER.AGILITY << endl << "Stärke: " << PLAYER.STRENGTH << endl << "Inteligenz: " << PLAYER.INTELEGENCE << endl ;


        cin >> iEnde;
    } while (iEnde !=2);

    cin >> ende;
    return 0;
}

Mein Problem ist, das sobald ich das Programm starte taucht planmäßig erst einmal die Aufforderung auf, eine Klasse per 1/2/3 zu wählen. Danach allerdings kommt eine Endlosschleife anstatt der Namensauswahl.

Ich hab bereits versucht die Schleife mit den beiden Variablen ende und iEnde zu unterbrechen aber trotzdem läuft das diese weiter. Ich hab mir das jetzt schon länger angeguckt und finde leider den Fehler nicht :(


Ob ihr mir helfen könnt ?





MFG Prigresh

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »Prigresh« (22.01.2014, 19:37)


Tankard

Treue Seele

Beiträge: 192

Beruf: Student, Hardware- und Softwareentwicklung als wissenschaftliche Hilfskraft

  • Private Nachricht senden

2

22.01.2014, 19:32

Versuch mal die cpp Tags im Quellcode Modus und nicht im Editor Modus.

Prigresh

Frischling

  • »Prigresh« ist der Autor dieses Themas

Beiträge: 5

Beruf: Schüler

  • Private Nachricht senden

3

22.01.2014, 19:36

Ja wunderbar :) supi ^^ dann schon mal das 1. Problem gelöst :P

Tankard

Treue Seele

Beiträge: 192

Beruf: Student, Hardware- und Softwareentwicklung als wissenschaftliche Hilfskraft

  • Private Nachricht senden

4

22.01.2014, 19:49

Zeile 52.

Du rufst eine Funktion auf, die ich niergends sehe. Allerdings sieht dein Code eher so aus als würdest du an dieser Stelle eine Funktion erstellen wollen. Da liegt zumindest schonmal ein Fehler.

Zitat


warning C4930: 'main::PLAYER_CHOSE CLASS_CHOSE_FUNKTION(void)': Funktion mit Prototyp wurde nicht aufgerufen (war eine Variablendefinition gemeint?)
warning C4101: 'CLASS_CHOSE_FUNKTION': Unreferenzierte lokale Variable

5

22.01.2014, 20:03

Dies ist der perfekte Zeitpunkt, sich mit einem Debugger vertraut zu machen. Er wird dir helfen, das Problem zu finden.
"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

Tankard

Treue Seele

Beiträge: 192

Beruf: Student, Hardware- und Softwareentwicklung als wissenschaftliche Hilfskraft

  • Private Nachricht senden

6

22.01.2014, 20:18

Ich denke im Debugger wird er finden, was falsch ist, aber nicht warum, aber das kann dann ja hier beantwortet werden.

Also erstmal den Hinweisen des Compilers nachgehen und dann mal Schritt für Schritt das Programm mit dem Debugger angucken.

Prigresh

Frischling

  • »Prigresh« ist der Autor dieses Themas

Beiträge: 5

Beruf: Schüler

  • Private Nachricht senden

7

22.01.2014, 20:28

So danke erst einmal für den Hinweis mit der Funktion. Hab das entsprechend geändert, sollte nun funktionieren hoffe ich mal ^^

Hab jetzt auch mal etwas im Buch vor gegriffen und mir den Debugger angeguckt (der erst zum ende des 8. Kapitels thematisiert wird). Bin soweit auch durch gegangen und habe 2 Fehler entdeckt.
Sowohl die Zeile 40 wie auch die Zeile 84 bezieht er zwar ein, wartet dort aber nicht auf eine Eingabe des "Spielers" sondern springt da gleich weiter in die nächste Zeile.

Ich hab mir die Zeilen jetzt auch noch mal angeguckt und mit den Buch verglichen, allerdings sehe ich da kein Unterschied :S

Tankard

Treue Seele

Beiträge: 192

Beruf: Student, Hardware- und Softwareentwicklung als wissenschaftliche Hilfskraft

  • Private Nachricht senden

8

22.01.2014, 20:39

Ich habe cin nie ernsthaft benutzt, also korrigiert mich wenn ich falsch liege.

Du bestätigst deine Eingabe ja mit einem return. Dieses return steckt noch im Eingabepuffer. Daher wird direkt eine leere Eingabe angenommen. Du kannst cin einfach nach jeder Eingabe bis zum Newline leeren.

cin.ignore(numeric_limits<streamsize>::max(), '\n');

Falls in dem Buch bereits std::string behandelt wurde, dann solltest du diesen auch anstatt char[] nutzen. Ebenfalls wäre ein Blick auf std::getline sinnvoll.

Prigresh

Frischling

  • »Prigresh« ist der Autor dieses Themas

Beiträge: 5

Beruf: Schüler

  • Private Nachricht senden

9

22.01.2014, 20:50

Ich habe cin nie ernsthaft benutzt, also korrigiert mich wenn ich falsch liege.

Du bestätigst deine Eingabe ja mit einem return. Dieses return steckt noch im Eingabepuffer. Daher wird direkt eine leere Eingabe angenommen. Du kannst cin einfach nach jeder Eingabe bis zum Newline leeren.

cin.ignore(numeric_limits<streamsize>::max(), '\n');

Falls in dem Buch bereits std::string behandelt wurde, dann solltest du diesen auch anstatt char[] nutzen. Ebenfalls wäre ein Blick auf std::getline sinnvoll.


Huhu, leider kenne ich bis jetzt keine andere Eingabe Methode als cin :S. Wo soll ich cin.ignore(numeric_limits<streamsize>::max(), '\n');
einfügen bzw. was genau bewirkt dieser Code ?

string ist bis jetzt noch nicht behandelt worden ähnlich wie getline bzw. irgendeine Form von std::... . Hab da mal nach geschaut in mein Reader und fest gestellt, das std:: in dieser form auch erst in Kapitel 9 bei der STL vorkommt :S


Was genau meinst du mit "Du bestätigst deine Eingabe ja mit einem return. Dieses return steckt noch im Eingabepuffer. " ?

Ich hab doch nur 2 return wobei 1 gar nicht erst angesprochen wird (da es eig. erst nach den Schleifen kommen soll und nur 0 zurück gibt und das 2. gibt doch nur die struct PLAYER zurück, was ja aber eigentlich keinen Einfluss auf die Schleife hat (?)


Es kann sein das im späteren Verlauf noch bessere Methoden gezeigt werden, allerdings würde ich das Problem ungern ignorieren, da ich sowas selbst immer nutze um mein Wissen zu festigen. Denk mal es macht auch wenig Sinn ein Problem ungelöst stehen zu lassen und in das nächste Kapitel zu gehen. Da vorherigere "Test" auch schon geklappt hatten und ich ehrlich gesagt kein triftigen Grund sehe, warum die Schleife nicht funktioniert würde ich doch gern das Problem lösen bevor ich weiter lese (als nächstes wären Zeiger dran).

Tankard

Treue Seele

Beiträge: 192

Beruf: Student, Hardware- und Softwareentwicklung als wissenschaftliche Hilfskraft

  • Private Nachricht senden

10

22.01.2014, 20:58

Du tippst deine Eingabe und danach drückst du auf return/enter. Dieses "enter" steckt noch in dem Eingabepuffer von cin.

Du tippst 2<enter> und im Eingabepuffer steht '2','\n'. Du liest die 2 aus und es bleibt das '\n'. Da du bei einer Eingabe immer bis zum Newline liest, wird im Anschluss eine leere Eingabe gelesen (da vor dem '\n' nichts mehr steht). Du musst also irgendwie die Eingabe leer bekommen, bevor du eine neue machst. Mit der Zeile
cin.ignore(numeric_limits<streamsize>::max(), '\n');
ignorierst/verwirfst du die nächsten x (hier x = maximale Anzahl an Zeichen die möglich sind) bis du ein '\n' bekommst. Somit ist dein Eingabepuffer leer und du kannst wieder etwas neues eingeben.

Ich hoffe ich habe jetzt keinen Unsinn erzählt. Habe ehrlich gesagt nie wirklich Eingaben per cin gemacht.

Werbeanzeige