Eine kurze Frage...



  • Ich komm mir naiv vor, wenn ich verlang, dass mir jemand meine Fehler sucht, aber ich bin wirklich dankbar, wenn ihr mir sagen könnt, was ich falsch gemacht habe. Wenn ich das "Programm" starte, bekomme ich die Meldung
    "Debug Assertion Failed! ... Expression: vector subscript out of range ..."

    #include <algorithm>
    #include <iostream>
    #include <string>
    #include <vector>
    
    using std::cin;
    using std::cout;
    using std::endl;
    using std::sort;
    using std::string;
    using std::vector;
    // Die Häufigkeit jedes einzelnen Wortes in dem eingegebenen Text
    // soll bestimmt werden.
    int main() {
    	cout << "Geben Sie bitte den Text ein: " << endl;
    	string x;
    	vector<string> woerter;
    
    	// Invariante: woerter enthält alle Wörter.
    	while(cin >> x)
    		woerter.push_back(x);
    
    	//Anzahl der Wörter
    	vector<string>::size_type groesse = woerter.size();
    
    	// Woerter sortieren
    	sort(woerter.begin(), woerter.end());
    
    	// Invariante: Alle Elemente von woerter wurden
    	// zusammen mit ihrer Häufigkeit ausgegeben.
    	vector<string>::size_type w_index = 0;
    
    	while(w_index <= groesse) {
    		int anzahl = 1;
    		if(woerter[w_index] != woerter[w_index + 1]) {
    			cout << woerter[w_index] << anzahl << endl;
    		} else {
    			while((w_index <= groesse) && (woerter[w_index] == woerter[w_index + 1])){
    				++anzahl;
    				++w_index;
    			}
    			cout << woerter[w_index] << anzahl << endl;
    		}
    		++w_index;
    	}
    	return 0;
    }
    

    edit: code-tags



  • Du verlässt wohl den gültigen Bereich mit einem Index für deinen vector. Was sagt der Callstack? Zur Not geh mal schrittweise durch und lokalisiere so den Fehler.

    EDIT: Das hier geht schief:

    if(woerter[w_index] != woerter[w_index + 1]) {
    

    Wenn der Index==Größe-1 ist, sitzt du auf dem letzten Element. Da kannst du nicht letztes Element +1 abfragen...

    EDIT2: Oh, viel zu spät... 🤡



  • while(w_index < groesse)
    NICHT <=


  • Administrator

    Die Indices gehen von 0 bis N - 1. Und nun schau dir mal diesen Codeabschnitt an:

    while(w_index <= groesse) { // !!!!!!
            int anzahl = 1; 
            if(woerter[w_index] != woerter[w_index + 1]) { // !!!!!!
                cout << woerter[w_index] << anzahl << endl; 
            } else { 
                while((w_index <= groesse) && (woerter[w_index] == woerter[w_index + 1])){ // !!!!!!
                    ++anzahl; 
                    ++w_index; 
                } 
                cout << woerter[w_index] << anzahl << endl; 
            } 
            ++w_index; 
        }
    

    Da muss es krachen 😉

    Grüssli



  • Zudem wirst du in Zeile 35 auch den Vektor verlassen mit w_index+1.



  • muss sogar so lauten damits mit dem vergleich des anchfolgenden elements klappt

    while ( index < groesse-1 )



  • OK DANKE!! dann hoff ich dass ichs jetzt hinkrieg 😃



  • Wie kommt man eigendlich über die stelle while(cin>>wert) weiter? Was muss man eigeben damit das false ist?



  • Hat ein bisschen gedauert, aber jetzt hab ichs. Nochmal danke an alle!!



  • AntiCin schrieb:

    Wie kommt man eigendlich über die stelle while(cin>>wert) weiter? Was muss man eigeben damit das false ist?

    Hab ich mich auch schon gefragt...



  • lol... vik wie wärs? Ne Antwort wär besser als ein Danke! :p



  • Samsn schrieb:

    lol... vik wie wärs? Ne Antwort wär besser als ein Danke! :p

    Die Antwort liegt doch auf der Hand: Debugger, Breakpoint, Ausführung um eine Zeile versetzen. Du musst dem Benutzer lediglich den Debugger und eine kurze Anleitung mitgeben. 😉



  • _matze schrieb:

    Samsn schrieb:

    lol... vik wie wärs? Ne Antwort wär besser als ein Danke! :p

    Die Antwort liegt doch auf der Hand: Debugger, Breakpoint, Ausführung um eine Zeile versetzen. Du musst dem Benutzer lediglich den Debugger und eine kurze Anleitung mitgeben. 😉

    Jetzt verstehe ich! Auch ein Grund um Handbücher schreiben zu dürfen! 👍



  • _matze schrieb:

    Hab ich mich auch schon gefragt...

    nimm EOF, das tut es ... 😃



  • Mitleid schrieb:

    _matze schrieb:

    Hab ich mich auch schon gefragt...

    nimm EOF, das tut es ... 😃

    Klar (*an-den-Kopf-klatsch*), wozu soll die EOF-Taste auf meiner Tastatur sonst gut sein? 😃



  • _matze schrieb:

    Klar (*an-den-Kopf-klatsch*), wozu soll die EOF-Taste auf meiner Tastatur sonst gut sein? 😃

    Aha, ein Luxusprodukt, was? Typisch Bourgeoisie. 😃 😃



  • Mitleid schrieb:

    _matze schrieb:

    Klar (*an-den-Kopf-klatsch*), wozu soll die EOF-Taste auf meiner Tastatur sonst gut sein? 😃

    Aha, ein Luxusprodukt, was? Typisch Bourgeoisie. 😃 😃

    Klar. Über die Optimus Maximus kann ich nur lachen. 😉



  • Uiui! Jetzt habe ich aber viel Beiträge verpasst während ich die Taste gesucht habe! 😮 😮

    😉

    /edit by pumuckl: ich hab mal die halbe Seite voller Leerzeilen rausgenommen...



  • OK, bevor das hier in einem Missveständnis ausartet ...

    Wir einfachen Proletarier ohne EOF-Taste nehmen unter Windows Strg+Z und unter Linux Strg+D



  • Mitleid schrieb:

    OK, bevor das hier in einem Missveständnis ausartet ...

    Wir einfachen Proletarier ohne EOF-Taste nehmen unter Windows Strg+Z und unter Linux Strg+D

    😡 HEY! Das wusste ich wirklich nicht! Danke 🤡


Anmelden zum Antworten