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

CeDoMain

Alter Hase

Beiträge: 587

Wohnort: Ilmenau

Beruf: Student für Mechatronik

  • Private Nachricht senden

11

14.08.2015, 16:06

OK, wie Hello_Kitty und Schorsch es beschrieben haben ist es fast richtig!

Das Problem ist, dass du da, wo ein int erwartet wird einen string eintippst.

Der Streamoperator >> wartet auf das Drücken von Enter. Dann versucht er ALLES, was er bekommen hat, in die Variable zu packen. Das geht natürlich nicht, weil ein string nunmal kein int ist.

Du musst also deinen Code so abändern, dass die Werte in einem string gespeichert werden. Beispiel:

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
#include <iostream>
#include <string>

using namespace std;

int main()
{
    cout << "Spielername: ";
    int Spielername;
    cin >> Spielername;
    cout << "Es wurde als Name \"" << Spielername << "\" eingegeben.";
    cout << "\n\n(j)a oder (n)ein?";
    
    
    char Eingabe;
    cin >> Eingabe;
    if (Eingabe == 'j')
    {
        cout << "Es wurde ja angegeben";
    }
    else
    {
        cout << "Es wurde nein angegeben";
    }
    return 0;
}
Mit freundlichem Gruß
CeDo
Discord: #6996 | Skype: cedomain

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

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »CeDoMain« (14.08.2015, 16:19)


CeDoMain

Alter Hase

Beiträge: 587

Wohnort: Ilmenau

Beruf: Student für Mechatronik

  • Private Nachricht senden

12

14.08.2015, 16:08

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?

Ich habe alle Exceptions angeschaltet... und du hast recht, wie du meinem vorherigen Post entnehmen kannst - ich habe mich vertan. Sorry!
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

13

14.08.2015, 16:24

Weiterhin vielen lieben Dank für die Mühen, aber ich glaube wir reden da gerade ein wenig aneinander vorbei:
Die Eingabe des Namens funktioniert vollkommen und leitet mich auch weiter (bin noch nicht beim Thema <string> angekommen und habe ihn daher nicht benutzt, gab dort aber keinerlei Fehler)....
Testweise habe ich dennoch #include <string> angegeben, um auszuschließen, dass es damit zu tun hat.
Abgesehen davon habe ich das mit dem Namen ja auch schon einmal zum Test vollständig herausgenommen und kam immernoch zu meinem Problem.
Weiterhin kommt also der selbe Fehler... anbei schicke ich ein Bild von dem Ergebnis, vielleicht wird es so verständlicher:
Der Text "Bildschirm wird geladen" dürfte dort doch gar nicht stehen, sondern erst, wenn ich "f" gedrückt habe....
LG
Und anbei nochmal mein aktueller Quellcode:

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

#include <iostream>
#include <string>
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 ;
}
»Brotkeks« hat folgendes Bild angehängt:
  • Problem2.PNG

Hello_Kitty!

unregistriert

14

14.08.2015, 16:28

@CeDoMain
Ja, aber der nun gepostete Code verwendet ja wieder keinen String!

@Brotkeks:
Versuche es beim Spielernamen mal mit Eingaben wie "123", "123n" oder "123f". Wenn du nur eine Zahl eingibst, wird es funktionieren wie erwartet. Wenn du eine Zahl und einen Buchstaben zusammen eingibst, wird in das int nur die Zahl eingelesen und der Buchstabe bleibt in einem internen Puffer zwischengespeichert. Die nächste Leseoperation cin >> chSpielmodus findet diesen Buchstaben dann und liest ihn sofort, deshalb wird keine weitere Eingabe abgewartet.

Wenn du bei Spielernamen "Herz" eingibst, kann gar nichts gelesen werden was einem int entspricht und die Leseoperation schlägt fehl. Jetzt müsstest du eigentlich auf den Fehler reagieren und den Stream (cin) zurücksetzen, ansonsten schlagen auch alle folgenden Leseoperationen fehl und werden übersprungen. Damit es auch mit Eingaben wie "Nele" funktioniert müsstest du wie CeDoMain hier schon sagte einen string verwenden und in dem Fall liest du am besten erstmal in deinem Buch etwas weiter.

Brotkeks

Frischling

  • »Brotkeks« ist der Autor dieses Themas

Beiträge: 26

Beruf: Azubi/Student

  • Private Nachricht senden

15

14.08.2015, 16:33

Vielen Dank, mit 123 hat es nun geklappt...

Was mich aber jetzt ziemlich verwirrt ist, wiese es genau den gleichen Fehler gab, obwohl ich den Code bezüglich der Namenseingabe komplett herausgenommen habe, mich also nur ums if und else gekümmert habe...

und wieso funktioniert es mit meinem jetzt eingefügten Code nicht? Habe es doch genauso gemacht wie CeDoMain ?!

@CeDoMain: Dann habe ich wohl nur an dir vorbeigeredet... Entschuldige bitte. Aber durch die Tatsache, dass der Fehler auch ohne den ganzen "Namenskäse" kam, hatte ich das ausgeschlossen oO

CeDoMain

Alter Hase

Beiträge: 587

Wohnort: Ilmenau

Beruf: Student für Mechatronik

  • Private Nachricht senden

16

14.08.2015, 16:36

Nein, wir reden nicht aneinander vorbei! ;) Du musst verstehen, dass Fehler nicht nur da in Erscheinung treten können, wo sie auch wirklich entstanden sind! Das ist eines der großen Schwierigkeiten beim Programmieren! Ich versuche mal zu erläutern:

Die Eingabe des Namens funktioniert vollkommen und leitet mich auch weiter

Das sieht nur so aus für dich! In Wirklichkeit gibt es einen Fehler, denn du kannst "Nele" nicht in einen Integer packen! Weil deine Konsole dir diesen Fehler aber nicht anzeigt, sieht alles fehlerfrei aus und das Programm geht weiter. Wenn du das nächste Mal aber cin benutzt (bei cin >> chSpielmodus ;) dann tritt der Fehler in erscheinung, indem cin nicht meht auf deinen Entertastendruck wartet, sondern einfach weitermacht. Weil dann in chSpielmodus nicht 'n' drinsteht, wird vollkommen richtig "Bildschirm wird geladen...." ausgegeben.

Wenn du keine Strings verwenden möchtest, dann bleibt dir nichts anderes übrig, als auf die Eingabe von "Nele" zu verzichten und stattdessen eine ganze Zahl anzugeben. Zum Beispiel 7, gefolgt von einem Druck auf die Entertaste.

Wenn du strings verwenden möchtest, dann ist das auch nicht weiter schwierig. Du kannst sie wie ein Integer oder Char mit cin >> füllen und mit cout << ausgeben. was du sonst noch damit anstellen kannst, ist erstmal uninteressant, das lernst du noch wenn du weiterließt!

Ich hoffe ich konnte dir etwas helfen! ;)

PS: Ich muss jetzt weg - kann dir erst in eine paar Stunden wieder antworten.

EDIT: Hello_Kitty war schneller! ;)
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

17

14.08.2015, 17:44

Dass Fehler dennoch auftreten können war mir wohl bewusst, sonst hätte ich zur Kontrolle nicht das string eingegeben :)
Was mich dazu veranleitet hat zu glauben, es habe nichts miteinander zu tun, war wie gesagt die Tatsache, dass der Fehler genauso kam, als ich komplett ohne den Quellcode zur Namenseingabe rumversucht habe und jedes Mal erneut der selbe Fehler kam... und das verstehe ich auch jetzt nicht so ganz...

LG

CeDoMain

Alter Hase

Beiträge: 587

Wohnort: Ilmenau

Beruf: Student für Mechatronik

  • Private Nachricht senden

18

14.08.2015, 19:53

Folgender Code funktioniert bei mir einwandfrei:

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
#include <iostream>
#include <string>

using namespace std;

int main()
{
    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;
    }
}
Bei der Eingabe von j kommt die untere Ausgabe und bei Eingabe von n die obere...
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

19

17.08.2015, 08:29

Vielen Dank für eure Hilfen :)
Dann werd ich das erstmal sein lassen, bis ich beim Thema bin :D
Viele liebe Grüße !

20

17.08.2015, 14:25

Ich würde an deiner Stelle noch ein - else if - einbauen. Weil dein Programm ist recht "unsicher".
Wenn die Taste 'n' gedrückt wird, wird der Text "Es war einmal..." ausgegeben ANSONSTEN
"Bildschirm wird geladen..."

Sprich, wenn man jetzt ein 'x' eingibt, wird auch der Text mit dem Bildschirm laden ausgegeben.
Es wär doch irgendwie schöner, wenn dort dann die Textausgabe "Falsche Eingabe" oder so kommen würde ^^

Werbeanzeige