Anfängerfrage: Range error



  • Hallo,

    ich habe folgenden Code und bekomme einen Range error. Ich kann einfach nicht finden, woran es liegt.

    /*Zahlen in Vektor einlesen und die ersten x Elemente aufsummieren. Differenz zwischen Elementen bilden.*/
    
    int main()
    try{
    
    	vector<double> zahlen;
    	vector<double> differenzen;
    	double zahl=0, differenz=0;
    	double aufsumme=0;
    	double Summe=0;
    	int i, k=0, n; //k zählt die Schleifen im while
    
    	cout << "Wie viele Zahlen sollen beginnend bei der Ersten aufsummiert werden?:\n";
    	cin >> aufsumme;
    
    	cout << "Bitte gib einige beliebige Zahlen ein (Eingabe mit | beenden):\n";
    	while(cin >> zahl)
    	{
    		zahlen.push_back(zahl);
    		k ++;
    		if(k != 1)//Differenz bilden außer für 1. Element
    		{
    			differenz = zahlen[k] - zahlen[k-1];
    			differenzen.push_back(differenz);
    		}
    	}
    
    	if(aufsumme >= zahlen.size()) error("Bereichsüberschreitung. Es wurden weniger Zahlen eingegeben."); //Check, ob genug Zahlen eingegeben wurden zum Summieren
    
    	/*weiterer Code, hier nicht relevant*/
    
    	cout << "\n\n";
    	system("pause");
    	return 0;
    }
    catch(exception& e)
    {
    	/**/
    }
    

    Der Fehler tritt nach Beenden der while-Schleife auf und nur, wenn die Sequenz mit den Differenzen drin ist. Es wird übrigens nicht meine Ausnahme geworfen, sondern was anderes. Ich seh den Fehler aber nicht. Kann mir bitte jemand helfen?



  • Check deine Indizes. Verwende dazu einen Debugger.



  • Schreib statt Zeile 29 das:

    if(aufsumme > zahlen.size()) { // nur >, nicht >=
      std::cerr << "Bereichsüberschreitung. Es wurden zu viele Zahlen eingegeben.\n";
      return -1;
    }
    


  • Ändere:

    differenz = zahlen[k] - zahlen[k-1];
    

    in:

    differenz = zahlen[k-1] - zahlen[k-2];
    


  • Wirf mal einen Blick auf std::adjacent_difference ...



  • Ach, wie blöd. Die Indizes sind um eins versetzt, stimmt. Hab's jetzt so gemacht, wie belli. Vielen Dank euch allen. Vom Draufstarren war ich schon völlig blind.

    @IrgendeinName: Wie meinst du das?

    IrgendeinName schrieb:

    Check deine Indizes. Verwende dazu einen Debugger.

    Ich bin doch am Debuggen. Compiler und Linker haben nicht gemeckert, erst beim Ausprobieren kam der Laufzeitfehler. Kann man das eher entdecken?

    @trycatchfinally->java: error() macht genau das, was du geschrieben hast (bis auf den Fehler mit >=, der wahrscheinlich mein nächstes Problem geworden wäre). Ich denke auch, dass es umständlich ist, allerdings hab ich das aus einem Buch und wollte erstmal dabei bleiben.

    @DocShoe: std::adjacent_difference macht die Sache einfacher 😉



  • Ich bin doch am Debuggen. Compiler und Linker haben nicht gemeckert, erst beim Ausprobieren kam der Laufzeitfehler. Kann man das eher entdecken?

    Nein, aber mit dem Debugger kannst du während der Laufzeit erkennen, an welcher Stelle des Codes du gerade steckst bzw. den Error bekommst, was die Sache doch deutlich einfacher machen sollte.



  • Der Tobi schrieb:

    Ich bin doch am Debuggen. Compiler und Linker haben nicht gemeckert, erst beim Ausprobieren kam der Laufzeitfehler. Kann man das eher entdecken?

    Nein, aber mit dem Debugger kannst du während der Laufzeit erkennen, an welcher Stelle des Codes du gerade steckst bzw. den Error bekommst, was die Sache doch deutlich einfacher machen sollte.

    Nicht nur das. Du kannst vor allem auch Werte von Variablen einsehen, schrittweise durch das Programm steppen, das Programm an bestimmten Stellen oder unter bestimmten Umständen anhalten lassen, dir den Speicher oder den Callstack (wer hat wen aufgerufen) ansehen uvm.



  • Kann man sich nicht sogar mit bestimmten Debuggern den Opcode angucken?

    PS, OT:

    Wie viele atheistische Babys hat man schon aus Versehen - oder gar mit Absicht! - getauft?

    👍



  • Der Tobi schrieb:

    Kann man sich nicht sogar mit bestimmten Debuggern den Opcode angucken?

    Assembly? ja.



  • Ok, da muss ich mich wohl etwas genauer mit dem Debuggen befassen. Ich drück immer nur F5 und guck, was da steht.

    Den OT kapier ich nicht. War aber vielleicht auch gar nicht für mich.



  • Eine vernünftige Implementierung der Standardbibliothek enthält Debug-Checks für Indizes in std::vector::operator[] .

    Stelle sicher, dass du im Debug-Modus kompilierst und den Debugger einschaltest.


Anmelden zum Antworten