Fehler in Ausgabe [geloest]



  • Ich brauch erstmal deinen aktuellen Quellcode:D



  • s.o. 😃
    include-Dateien etc erklären sich von selbst, ist ja nur Teil vom Code



  • void wait()
    {
    	std::cin.ignore( std::numeric_limits<std::streamsize>::max(), '\n' ); // #include <limits>
    	std::cin.get();
    }
    
    struct Ausruestung
    {
        string Name;
        double Wert;
        int Nummer;
    };
    
    void W_Werkzeug(std::vector<Ausruestung> Werkzeug) // Funktion fuer Werkzeuge
    {
    	const unsigned WAnzahl = Werkzeug.size();
    	std::cout << '\n' << '\n' << "Folgende Werkzeuge " << WAnzahl << " sind in der Datenbank:" << '\n';
        for (int i=0; i<WAnzahl; i++) // nach und nach
        {
            std::cout << "Werzeug Nummer: " << Werkzeug[i].Nummer << '\n';
            std::cout << "Werzeug Name: "   << Werkzeug[i].Name   << '\n';
            std::cout << "Werzeug Wert: "   << Werkzeug[i].Wert   << " Euro" << '\n' << '\n';
        }
        //std::cin.get(); // Ist dir noch nicht aufgefallen, dass das eigentlich nichts bringt.
    	wait();
    };
    
    int main()
    {
    	std::vector<Ausruestung> werkzeug;
    
        Ausruestung Werkzeug_Hammer;
        Werkzeug_Hammer.Nummer = 1;
        Werkzeug_Hammer.Name = "Hammer";
        Werkzeug_Hammer.Wert = 9.99;
        werkzeug.push_back( Werkzeug_Hammer );
    
        Ausruestung Werkzeug_Zange;
        Werkzeug_Zange.Nummer = 2;
        Werkzeug_Zange.Name = "Zange";
        Werkzeug_Zange.Wert = 4.99;
        werkzeug.push_back( Werkzeug_Zange );
    
        Ausruestung Werkzeug_X;
        cin >> Werkzeug_X.Name;
        werkzeug.push_back( Werkzeug_X );
    
        W_Werkzeug(werkzeug); // Rueckgabe
    }
    

    Hab mal ein paar Dinge korrigiert. 😃



  • xStrykex schrieb:

    [...]nutze lieber endl statt '\n' 😃 Wäre so viel Schreibarbeit

    Das ist nur bedingt ein guter Grund.

    Guckst Du:

    std::cout << "Werzeug Nummer: " << Werkzeug[i].Nummer;
            std::cout << "\nWerzeug Name: " << Werkzeug[i].Name;
            std::cout << "\nWerzeug Wert: " << Werkzeug[i].Wert << " Euro\n\n";
    

    Oder sogar noch kürzer:

    std::cout << "Werzeug Nummer: " << Werkzeug[i].Nummer
                      << "\nWerzeug Name: " << Werkzeug[i].Name
                      << "\nWerzeug Wert: " << Werkzeug[i].Wert << " Euro\n\n";
    

    Oder kürzer und C++iger:

    std::ostream& operator<<(std::ostream& os, const Ausruestung& a){
      os << "Werkzeug Nummer: " << a.Nummer
         << "\nWerkzeug Name: " << a.Name
         << "\nWerkzeug Wert: " << a.Wert << " Euro";
      return os;
    }
    
    void W_Werkzeug(vector<Ausruestung>Werkzeug, int WAnzahl)
    {
      cout << "\n\nFolgende Werkzeuge " << WAnzahl << " Sind in der Datenbank:\n";
        for (int i=0; i<WAnzahl; i++)
        {
          cout << Werkzeug[i] << "\n\n";
        }
    }
    


  • Also ich hatte das

    cin.get();
    

    am Ende der main, das hat nicht gereicht, habe ich es dort(Ausgabefunktion) reingepackt, hat es geklappt. Mit

    wait();
    

    klappt es gar nicht. 😃
    Jetzt hast mich doch zur ".size" bekommen 😛 😃

    @Furble Wurble: Habe noch nicht mit Referenzen gearbeitet, hat out auch schon versucht 😃

    Ansonsten: Stimmt, net dran gedacht bzw gesehen 😃

    Ist es überhaupt irgendwann nötig endl zu benutzen? Ich hatte mir den Thread, den out gepostet hat, durchgelesen, aber habe dort nicht erfahren können, ob man endl überhaupt irgendwann benötigt.



  • Natürlich klappt wait , wieso sollte es nicht funktionieren? Also ich habe endl noch nie wirklich gebraucht.



  • out schrieb:

    Natürlich klappt wait , wieso sollte es nicht funktionieren?

    sry, bei mir klappts net, egal wieviele ich irgendwo hinsetze 😃
    Habe mal gelesen, dass manche Compiler manche Befehle wie wait(), cin.get(), getchar() nicht mehr annehmen würden. Habe anfangs getchar() benutzt. Hat anfangs geklappt und irgendwann nicht mehr, selbst dann nicht, wenn ich danach alles gelöscht und ein einfaches

    int i=5;
    int j=5;
    cout << j+i;
    

    z.B. eingegeben habe. Ist mir rätselhaft 😃

    out schrieb:

    Also ich habe endl noch nie wirklich gebraucht.

    Ok, mir würde spontan auch nix einfallen, aber bin auch noch Anfänger 🙄



  • Bist du sicher, dass du meine wait Funktion verwendest? Ansonsten kopier diese zwei Zeilen einfach an das Ende deiner Main-Funktion:

    std::cin.ignore( std::numeric_limits<std::streamsize>::max(), '\n' ); // #include <limits>
        std::cin.get();
    

    Und funtioniert das:D ?



  • Ne, dann sind sogar die wait()´s nicht mehr definiert. 😃
    Habe schon die void wait(){...} abkopiert und nachgelesen. 🕶

    Jetzt die *wait()*´s entfernt, aber immer noch dasselbe Problem. 😃

    Ist ja im Prinzip auch irrelevant, konnte fix abgucken und sehen, dass alles richtig ist 😃
    Aber kurios 🤡



  • Ich kann mir vorstellen, dass du sowas aus Versehen machst:

    int main()
    {
    	std::string x; // Eingabe: hallo welt
    	cin >> x;
    	int wert;
    	cin >> wert;
    
    	std::cin.ignore( std::numeric_limits<std::streamsize>::max(), '\n' ); // #include <limits>
        std::cin.get(); 
    }
    

    Sprich du gibst eine Zeichenkette ein, die ein Leerzeichen enthält, und danach willst du ein Zahl einlesen. Dann geht gehts wirklich nicht mehr. In dem Fall musst du diese 3 Zeilen benutzen:

    std::cin.clear();
    	std::cin.ignore( std::numeric_limits<std::streamsize>::max(), '\n' ); // #include <limits>
        std::cin.get();
    

    Damit wartest du mit Sicherheit.



  • Ok, jetzt funktioniert alles einwandfrei, danke 😃



  • Ach, ich habe meinen Fehler entdeckt, habe die Daten in der falschen Reihenfolge eingelesen 🙄
    jetzt klappts auch ohne das clear() etc 🙂



  • Gut, aber das clear schadet nicht. Ich habe in der wait Funktion immer alle drei Anweisungen drin stehen, damit es in jeder Situation funktioniert.



  • Ok, merk ich mir 🙂

    Nun wollte ich eine while-Schleife einbauen:

    Ausruestung Werkzeug_X;
    	std::cout << "\n\nBei Eingabe \"0\" Abbruch\n";
    	while (Werkzeug_X.Nummer != 0) // Wiederholungen solange Werkzeug_X.Nummer!= 0
    	{
    	std::cout << "\nGeben Sie die Nummer ein: \n";
    	std::cin >> Werkzeug_X.Nummer;
    	std::cout << "\nGeben Sie den Namen ein: \n";
    	std::cin >> Werkzeug_X.Name;
    	std::cout << "\nGeben Sie den Wert ein: \n";
    	std::cin >> Werkzeug_X.Wert;
    	werkzeug.push_back( Werkzeug_X );
    
    	W_Werkzeug(werkzeug); // Rueckgabe
    	}
    

    Funktioniert soweit. Diesmal das Problem, dass bei 0 nicht abgebrochen wird, woran liegt das? 😕



  • Da wird bei 0 schon abgebrochen. 😮 Wieso sollte es nicht abbrechen?



  • Ist jetzt schwer zu sagen, weil ich nicht weiß was vorher passiert, aber ich vermute, dass die Schleife gar nicht ausgeführt wird, da Werkzeug_X.Nummer nicht initialisiert ist. Probier mal die do-while-Schleife :

    Ausruestung Werkzeug_X;
        std::cout << "\n\nBei Eingabe \"0\" Abbruch\n";
        do // Wiederholungen solange Werkzeug_X.Nummer!= 0
        {
        std::cout << "\nGeben Sie die Nummer ein: \n";
        std::cin >> Werkzeug_X.Nummer;
        std::cout << "\nGeben Sie den Namen ein: \n";
        std::cin >> Werkzeug_X.Name;
        std::cout << "\nGeben Sie den Wert ein: \n";
        std::cin >> Werkzeug_X.Wert;
        werkzeug.push_back( Werkzeug_X );
    
        W_Werkzeug(werkzeug); // Rueckgabe
        }
        while (Werkzeug_X.Nummer != 0);
    


  • Ja, aber es wird dann noch der Name und Wert abgefragt und ausgegeben.
    Ich weiß aber nicht, wie ich das anstellen soll, dass er bei 0 sofort abbricht, ohne dabei diese beiden Eingaben aus der Schleife zu nehmen.
    Könnte ich break dafür einsetzen oderm gibt es etwas sinnvolleres, tut mir Leid, noch etwas müde und Kaffee schmeckt momentan net 😃

    EDIT: mit der do-while-Schleife passiert dasselbe. 😕



  • xStrykex schrieb:

    Ja, aber es wird dann noch der Name und Wert abgefragt und ausgegeben.

    Logisch, ein C+++-Programm wird von oben nach unten abgearbeitet. Und nach deine Eingabe von Nummer steht nunmal std::cout << "\nGeben Sie den Namen ein: \n"; . D.h. du musst nach der Eingabe von Nummer eine if-Anweisung einbauen und falls die Bedingung wahr ist, die Schleife mit break beenden.



  • Habe es jetzt so gelöst:

    Ausruestung Werkzeug_X;
    	std::cout << "\n\nBei Eingabe \"0\" Abbruch\n";
    	do
    	{
    	std::cout << "\nGeben Sie die Nummer ein: \n";
    	std::cin >> Werkzeug_X.Nummer;
    	if (Werkzeug_X.Nummer != 0)
    	{
    		std::cout << "\nGeben Sie den Namen ein: \n";
    		std::cin >> Werkzeug_X.Name;
    		std::cout << "\nGeben Sie den Wert ein: \n";
    		std::cin >> Werkzeug_X.Wert;
    		werkzeug.push_back( Werkzeug_X );
    	}
    	else
    		break;
    
    	W_Werkzeug(werkzeug); // Rueckgabe
    	}
    	while (Werkzeug_X.Nummer != 0);
    

    klappt 🙂



  • Joa, es funktioniert, schau es dir aber mal nochmal genau an. Finest du es nicht etwas komisch. 😃 Wenn du die if so machst, dann wäre ein break nicht mehr nötig, wenn du eine gewisse Zeile wo anders hin verschiebst.

    PS: ich hatte eine andere if-Bedingung im Sinne. 😃


Anmelden zum Antworten