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

Brotkeks

Frischling

  • »Brotkeks« ist der Autor dieses Themas

Beiträge: 26

Beruf: Azubi/Student

  • Private Nachricht senden

1

14.08.2015, 14:48

Problem beim Testen mit else und If

Hallo, ich nochmal :)
Ich bin gerade bis einschließlich Kapitel 3.5 gekommen, wollte mal ne kurze Pause machen um alles sacken zu lassen und habe dann probiert eigenständig was aus dem Gelernten zu machen.
Anbei schicke ich gleich mal ein Bild im Anhang.
Meine Wunschausgabe wäre folgende:
"Herzlich Willkommen.
Spielername:"
> Hier gibt man dann den Namen ein, dann geht es zum nächsten Text
"Spielmodus wählen
Möchten Sie ein (n)eues Spiel starten oder (f)ortfahren?"
> Hier soll dann n oder f eingegeben werden und jenachdem dann der Text "Es war einmal ..." kommen oder "Bildschirm wird geladen"
Beim erstellen der neuen Projektmappe wird mir auch kein Fehler angezeigt.
Mein Problem ist jetzt, dass sobald ich einen Namen eingebe, kommen alle drei Texte sofort, also:
"Spielmodus wählen
Möchten Sie ein (n)eues Spiel starten oder (f)ortfahren?
Es war einmal ...
Bildschirm wird geladen"
Ich habe jetzt ganz oft rumexperimentiert, Semikolons und geschweifte Klammern gesetzt und getauscht wie ne Irre, aber nix ändert etwas. Genauso habe ich mit if, else, else if usw. experimentiert.
Einmal habe ich die erste Eingabe komplett entfernt (Also das mit Spielernamen eingeben) und mich nur auf den Spielmodus mit if und else konzentriert. Das hatte dann irgendwann zur Folge, dass folgendes kam:
"Herzlich Willkommen
Spielmodus wählen
Möchten Sie ein (n)eues Spiel starten oder (f)ortfahren?
Bildschirm wird geladen...."
Also den Teil mit "Es war einmal" komplett rausgenommen, jedoch weiterhin auf den cin Befehl rein gar nicht geachtet.
Sitze da jetzt schon lange dran und komme einfach zu keiner Lösung, trotz rumprobieren und immer wieder Vergleichen mit dem Quelltext zu if und else im Buch....
Ich gehe davon aus, dass ich irgendwas ganz banales vergesse/übersehen habe oder hier irgendwas probiere, was so im Buch erst später kommt (bisher gab es keine zwei "Unabhängigen" Eingaben)
Ich hoffe ihr könnt meinen noch immer wirren Gedankengängen folgen und vielen Dank im Voraus!
LG
Edit: Habe ebenfalls beim "Spielmodus" int und char probiert.
»Brotkeks« hat folgendes Bild angehängt:
  • Problem1.PNG

cojo2015

Alter Hase

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

2

14.08.2015, 15:22

Kurze Frage: Wieso hast du mehrere geschweifte Klammern?

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
...
int main()
{
    {
     cout << "Herzlich wilkommen!" << endl;
     ...
     }

     {
      char chSpielmodus;
      ...
     }

return 0;
}

Brotkeks

Frischling

  • »Brotkeks« ist der Autor dieses Themas

Beiträge: 26

Beruf: Azubi/Student

  • Private Nachricht senden

3

14.08.2015, 15:24

Das war einfach zum Testen, weil ich verzweifelt war :D Das ist jetzt die Version, wie ich sie zuletzt hatte. Hatte es zwischendurch auch schon mit weniger oder gar noch mehr Klammern probiert... wie gesagt hatte da alles mal ausprobiert, aber kam zu keiner Lösung.
Liebe Grüße :)

cojo2015

Alter Hase

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

4

14.08.2015, 15:33

Also ich habe folgenden Code mal ausprobiert:

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
#include <iostream>
using namespace std;

int main()
{
    cout << "Herzlich Willkommen \n";

    int Spielername;
    cout << "Spielername: ";
    cin >> Spielername;

    char chSpielmodus;
    cout << "\nSpielmodus waehlen\n";
    cout << "Moechten Sie ein (n)eues Spiel starten oder (f)ortfahren?: \n";
    cin >> chSpielmodus;

    if (chSpielmodus == 'n')
        cout << "Es wahr einmal..." << endl;
    else
        cout << "Bildschirm wird geladen..." << endl;

    return 0;
}


Bei mir macht er alles so, wie er soll. Wie hast du denn dein Projek erstellt?

CeDoMain

Alter Hase

Beiträge: 587

Wohnort: Ilmenau

Beruf: Student für Mechatronik

  • Private Nachricht senden

5

14.08.2015, 15:34

Hallo Brotkeks,

anstatt deinen Code als Bild zu schicken, kannst du ihn auch in den Code-Tags posten, die du im Antwort-Editor findest. Einfach auf "C++" oben klicken.

Die 4 äußeren geschweiften Klammern sind unnötig, denn solche Klammern benötigst du nur, wenn du einen Bereich für eine Kontrollstruktur wie if, else, while und for markieren willst.

Wenn ich das richtig verstanden habe, dann möchstest du einen Spielernamen bei "Spielername:" eingeben können. Darunter verstehe ich mehrere chars (Buchstaben oder Zahlen) hintereinander. Soetwas nennt man string. Um diesen Datentyp benutzen zu können, fügst du ganz oben #include <string> ein. Folgender Code würde dann einen Spielernamen einlesen und in der lokalen Variable Spielername vom Typ string abspeichern:

C-/C++-Quelltext

1
2
3
cout << "Spielername: ";
string Spielername;
cin >> Spielername;

Warum der Code mit dem char nicht funktioniert kann ich dir auf den ersten Blick nicht sagen. Kannst du den Code mal so wie er im Bild zu sehen ist in den oben genannten Code-Tags posten, dann kann ich ihn mal hier bei mir compilieren und testen.
Mit freundlichem Gruß
CeDo
Discord: #6996 | Skype: cedomain

Lass solche persönlichen Angriffe lieber bleiben, meine sind härter.

Hello_Kitty!

unregistriert

6

14.08.2015, 15:42

Warum der Code mit dem char nicht funktioniert kann ich dir auf den ersten Blick nicht sagen. Kannst du den Code mal so wie er im Bild zu sehen ist in den oben genannten Code-Tags posten, dann kann ich ihn mal hier bei mir compilieren und testen.
Entweder weil cin sein failbit setzt, nachdem der Spielername nicht als int gelesen werden kann, oder weil sich noch weitere Zeichen im internen Buffer befinden, die dann sofort gelesen werden.

CeDoMain

Alter Hase

Beiträge: 587

Wohnort: Ilmenau

Beruf: Student für Mechatronik

  • Private Nachricht senden

7

14.08.2015, 15:47

Entweder weil cin sein failbit setzt, nachdem der Spielername nicht als int gelesen werden kann, oder weil sich noch weitere Zeichen im internen Buffer befinden, die dann sofort gelesen werden.
Nein, das kann nicht das Problem sein, denn wenn ich den String durch einen int ersetze, bekomme ich eine Fehlermeldung in der Konsole, von der der Threadersteller nichts geschrieben hat. Außerdem würde das VisualStudio mit einer Exception melden - das hat er vermutlich, wie ich an den Code-Farben aus seinem Post erkenne...
Mit freundlichem Gruß
CeDo
Discord: #6996 | Skype: cedomain

Lass solche persönlichen Angriffe lieber bleiben, meine sind härter.

Brotkeks

Frischling

  • »Brotkeks« ist der Autor dieses Themas

Beiträge: 26

Beruf: Azubi/Student

  • Private Nachricht senden

8

14.08.2015, 15:48

Hallo und Danke für die Tipps :)

Habe es jetzt haargenau so geschrieben wie CeDoMain .. gleiches Spielchen wie zuvor: Nach der Eingabe des Spielernamens kommt

"Herzlich Willkommen
Spielmodus waehlen
Moechten Sie ein (n)eues Spiel starten oder (f)ortfahren?
Bildschirm wird geladen"

Ja genau, ich möchte einen Spielernamen eingeben können ... bin aber noch nicht beim Thema strings etc. angekommen und dachte ich könnte da einfach offen lassen, was man eingibt...solange man irgendwas eingibt kommt der nächste Bildschirm -> Klappt ja auch! Da liegt nicht das Problem. Das Problem liegt bei dem danach ;)




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
// Ein weiterer Test 

#include <iostream>

using namespace std ;


// Hauptprogramm

int main ()
{
    cout << "Herzlich Willkommen \n" ;
    
    int Spielname ;
    cout << "Spielername: " ;
    cin >> Spielname ;
    
    char chSpielmodus ;
    cout << "\nSpielmodus waehlen \n" ;
    cout << "Moechten Sie ein (n)eues Spiel starten oder (f)ortfahren?: \n " ;
    cin >> chSpielmodus ;
    
    if (chSpielmodus == 'n')
        cout << "Es war einmal vor langer Zeit..." << endl ;
    
    else 
        cout << "Bildschirm wird geladen...." << endl;
    
    return 0 ;
}

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

9

14.08.2015, 15:52

Spontan würde ich behaupten da läuft folgendes ab. Der Benutzer/du gibst einen Namen in der Konsole ein. Aus dem Stream soll jetzt ein Wert in eine int-Variable geschoben werden. Das erste Zeichen wird aus dem Stream gelesen (ein einzelnes char) und zu einem int gecastet. Im int müsste dann wenn ich das richtig im Kopf habe der ASCII Code des Zeichens landen. Jetzt soll die nächste Abfrage kommen. Im Stream befinden sich noch Zeichen die verarbeitet werden können. Du müsstest den Stream danach leeren und gegebenenfalls das failbit checken. Bin da zur Zeit nicht so drin. Du könntest einfach mal einen Haltepunkt in Visual Studio in der Zeile danach setzen und gucken was in der Variable landet.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Hello_Kitty!

unregistriert

10

14.08.2015, 16:00

Nein, das kann nicht das Problem sein, denn wenn ich den String durch einen int ersetze, bekomme ich eine Fehlermeldung in der Konsole, von der der Threadersteller nichts geschrieben hat. Außerdem würde das VisualStudio mit einer Exception melden - das hat er vermutlich, wie ich an den Code-Farben aus seinem Post erkenne...
C++ Streams werfen standardmäßig gar keine Exceptions, die muss man erst anschalten. Außerdem widersprichst du dir selbst, einerseits kann es nicht das Problem sein, andererseits hat VisualStudio deiner Meinung nach genau das gemeldet - ja was denn nun?

Werbeanzeige