Teilprogramm kann nur einmal pro Programmstart ausgeführt werden



  • Moin,
    vorab erstmal angemerkt: Bin noch neu bei C++. Dementsprechend ist in dem Bereich auch mein Wissensstand.

    Aber jetzt mal zum Problem. Ich bin grad dabei nem kleinen Zufallsgenerator zu basteln, der mir zufällig einen Game Key ausgeben soll der vorab in eine Datei eingetragen wurde. Außerdem soll es möglich sein, den Key innerhalb den Programms zur Liste hinzuzufügen.
    Mit folgendem Code hab ich mir erstmal nen kleines Menü zusammen gebastelt:

    #include <fstream>
    #include "ZufallsGen.h"
    #include "Key hinzufügen.h" 
    #include "version.h"
    
    int UserInput;
    
    
    int	main()
    {
    	printVersion();
    
    	while (true)
    	{
    		
    
    		std::cout << "Was moechtest du tun?\n 1: Zufallsgenerator starten\n 2: Key hinzufuegen\n 3: Beende\n";
    		std::cin >> UserInput;
    
    		if (UserInput == 1) //ZufallsGen starten
    		{
    			system("cls");
    			Gen();
    		}
    
    		else if (UserInput == 2) //Key hinzufügen
    		{
    			system("cls");
    			AddKey();
    		}
    
    		else if (UserInput == 3) //Beenden
    		{
    			break;
    		}
    
    		else
    		{
    			std::cout << "Ungueltige Eingabe!\n Tippe 1 ein um den Zufallsgenerator zu starten\n Tippe 2 ein um einen Key hinzuzufügen\n Tippe 3 ein um zu beenden";
    			system("pause");
    		}
    
    		system("cls");
    	}
    
    	return 0;
    }
    
    

    Mein Problem ist der Punkt mit dem Key hinzufügen. Funktionieren tut dies, allerdings nur ein einziges Mal pro Programm start. Sobald ich einen Key hinzugefügt habe und einen neuen hinzufügen will überspringt das Programm jede Ein- und Ausgabe und geht direkt zum ende des Codes was bedeutet, dass er zurück ins Menü geht.
    Der Code sieht wie folgt aus:

    #include <iostream>
    #include <istream>
    #include <stdio.h>
    #include <fstream>
    #include "Key hinzufügen.h"
    
    
    
    int correct = 0;
    //std::string KeyName[2];
    char GameName[256]; 
    char NewKey[256];
    
    void AddKey()
    {
    	while (correct != 1)
    	{
    		std::cout << "Wie heisst das Spiel?:\n"; //Game Namen eintragen lassen
    		std::cin.ignore();
    		std::cin.getline(GameName, 256);
    		
    
    		std::cout << "Schreibe nun den Gamekey rein:\n"; //Game Key eintragen lassen
    		std::cin.ignore();
    		std::cin.getline(NewKey, 256);
    		
    
    
    			std::cout << "Ist der Name des Spiels und der Gamekey " << GameName << " " << NewKey << " korrekt?. Gib die Zahl ein!\n 1. Ja\n 2. Nein\n"; //Key überprüfen lassen
    			//std::cin.ignore();
    			std::cin >> correct;
    
    
    			if (correct == 1)
    			{
    				std::ofstream out;
    				out.open("Keys.txt", std::ofstream::app);
    				out << GameName << " " << NewKey << std::endl;
    				out.close();
    			}
    	}
    
    
    
    	
    
    	//std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); //cin buffer löschen
    			system("cls");
    		}
    

    mit system("pause"); hab ich getestet, ob der Code überhaupt aufgerufen wird. Sobald ich zum Programmteil navigiere wo der Key hinzugefügt werden soll, kommt "Drücke Taste(...)". Der Code wird also aufgerufen, also gehe ich davon aus, dass es irgendwo innerhalb des Key hinzufügen Codes n Problem gibt.
    Hat jemand ne Idee wo bei meinem Code das Problem liegt? Den Zufallsgenerator kann ich so oft ausführen wie ich will ohne das dieser Probleme macht.
    Greetz



  • @JoeJoke sagte in Teilprogramm kann nur einmal pro Programmstart ausgeführt werden:

    int correct = 0;

    Wie oft wird das ausgeführt?

    Warum benutzt du globale Variablen?

    Warum benutz du char Arrays statt std;;string?



  • @manni66 sagte in Teilprogramm kann nur einmal pro Programmstart ausgeführt werden:

    Wie oft wird das ausgeführt?

    Ich gehe jetzt davon aus, dass int correct = 0; nur einmal ausgeführt wird.
    Hab jetzt zum testen mal ganz am anfang der while schleife mal

    std::cout << correct;
    		system("pause");
    

    gesetzt. Beim ersten mal ausführen wird mir der Wert korrekt mit 0 ausgegeben, beim 2. mal ausführen tritt das oben beschriebene Problem auf. Gehe also jetzt mal davon aus, dass die Schleife beim 2. mal gar nicht erst ausgeführt wird sondern ignoriert wird aus irgendeinem Grund.

    @manni66 sagte in Teilprogramm kann nur einmal pro Programmstart ausgeführt werden:

    Warum benutzt du globale Variablen?

    Du meinst du globalen Variablen im Menü, also Gen(); und AddKey();? Die verwende ich, da ich den Zufallsgen wie auch den Programmteil zum Key hinzufügen in eine extra .cpp ausgelagert habe.

    @manni66 sagte in Teilprogramm kann nur einmal pro Programmstart ausgeführt werden:

    Warum benutz du char Arrays statt std;;string?

    Die Char Arrays nutze ich, da bei nem std::string keiner Leerzeichen übernommen wurden. Wenn ich zu dem Key auch den Namen mit einbinden will ist es ohne Leerzeichen bissel blöd zu lösen, gerade da dann die nächste Abfrage direkt übersprungen wird. Durch die Char Arrays kriege ich auch die Leerzeichen in die Variable.



  • @JoeJoke sagte in Teilprogramm kann nur einmal pro Programmstart ausgeführt werden:

    Die Char Arrays nutze ich, da bei nem std::string keiner Leerzeichen übernommen wurden.

    std::getline(). operator>>() liest nur bis zum nächsten Whitespace.

    @JoeJoke sagte in Teilprogramm kann nur einmal pro Programmstart ausgeführt werden:

    Du meinst du globalen Variablen im Menü, also Gen(); und AddKey();? Die verwende ich, da ich den Zufallsgen wie auch den Programmteil zum Key hinzufügen in eine extra .cpp ausgelagert habe.

    Lokale Variablen und als Parameter übergeben. Globale Variablen ohne wirklich wirklich guten Grund sind Gaga.



  • @Swordfish sagte in Teilprogramm kann nur einmal pro Programmstart ausgeführt werden:

    std::getline(). operator>>() liest nur bis zum nächsten Whitespace.

    Bisher hat es bei mir mit dem einlesen der Wörter mit mehreren Leerzeichen wunderbar funktioniert. Bloß das 2. mal aufrufen des Codes macht probleme.

    @Swordfish sagte in Teilprogramm kann nur einmal pro Programmstart ausgeführt werden:

    Lokale Variablen und als Parameter übergeben. Globale Variablen ohne wirklich wirklich guten Grund sind Gaga

    Dann werd ich das ganze nochmal überarbeiten bei Zeiten. Wie schon erwähnt bin ich ziemlich neu in der Materie und das war so jetzt erstmal die einfachste Lösung die ich jetzt gefunden habe um alles auf verschiedene Dateien auszulagern.



  • @JoeJoke sagte in Teilprogramm kann nur einmal pro Programmstart ausgeführt werden:

    Bisher hat es bei mir mit dem einlesen der Wörter mit mehreren Leerzeichen wunderbar funktioniert.

    Maybe. Nimm std::getline() und std::string.



  • @JoeJoke
    Schnapp dir einfach deine globalen Variablen und verschiebe sie in die Funktionen rein. Mehr sollte nicht nötig sein. Du verwendest die Variablen ja eh nur lokal. Der einzige effektive Unterschied wird dabei sein dass correct dann bei jeder Ausführung von AddKey neu mit 0 initialisiert wird. Und genau dieser Unterschied behebt deinen Bug.

    Um die restlichen Dinge kannst du dich später kümmern.



  • @JoeJoke sagte in Teilprogramm kann nur einmal pro Programmstart ausgeführt werden:

    Ich gehe jetzt davon aus, dass int correct = 0; nur einmal ausgeführt wird.

    Korrekt 🙂

    Hab jetzt zum testen mal ganz am anfang der while schleife mal

    std::cout << correct;
    		system("pause");
    
    

    gesetzt. Beim ersten mal ausführen wird mir der Wert korrekt mit 0 ausgegeben, beim 2. mal ausführen tritt das oben beschriebene Problem auf. Gehe also jetzt mal davon aus, dass die Schleife beim 2. mal gar nicht erst ausgeführt wird sondern ignoriert wird aus irgendeinem Grund.

    Na was meinst du was der Grund sein könnte?
    Pack das

    std::cout << correct;
    		system("pause");
    

    mal vor die while Schleife, dann siehst du den Grund.



  • @hustbaer sagte in Teilprogramm kann nur einmal pro Programmstart ausgeführt werden:

    globalen Variablen und verschiebe sie in die Funktionen rein

    Also nur das ich das jetzt grad richtig verstehe. Du meinst den Code zurück in die Haupt .cpp Datei zurück schieben?

    @hustbaer sagte in Teilprogramm kann nur einmal pro Programmstart ausgeführt werden:

    mal vor die while Schleife, dann siehst du den Grund.

    Erwischt. Ja, dann ist jetzt klar wo der Bug war. Jetzt funktioniert das sogar mit dem aktuellen setup

    void AddKey()
    {
    	int correct = 0;
    	char GameName[256]; 
    	char NewKey[256];
    	
    	std::cout << correct;
    	system("pause");
    
    	while (correct != 1)
    

    War n schlauer Denkfehler meinerseits. 😃



  • @JoeJoke sagte in Teilprogramm kann nur einmal pro Programmstart ausgeführt werden:

    Also nur das ich das jetzt grad richtig verstehe. Du meinst den Code zurück in die Haupt .cpp Datei zurück schieben?

    Pack' bitte die globalen Variablen in die Funktionen rein in denen sie verwendet werden. So nah wie möglich dort deklarieren wo sie verwendet werden. Und nimm um himmelswillen bitte keine char-Arrays sondern std::string. Danke.



  • @Swordfish std::string ist geändert.



  • @JoeJoke sagte in Teilprogramm kann nur einmal pro Programmstart ausgeführt werden:

    @hustbaer sagte in Teilprogramm kann nur einmal pro Programmstart ausgeführt werden:

    globalen Variablen und verschiebe sie in die Funktionen rein

    Also nur das ich das jetzt grad richtig verstehe. Du meinst den Code zurück in die Haupt .cpp Datei zurück schieben?

    Nein, ich meine genau das was du hier gemacht hast:

    void AddKey()
    {
    	int correct = 0;
    	char GameName[256]; 
    	char NewKey[256];
    

Log in to reply