Vector in Schleife geht nicht

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Vector in Schleife geht nicht

    Hallo User,

    bin gerade dabei, Visual C++ zu erlernen. Habe dazu ein Buch von Galileo Computing, in der ich eine Aufgabe bekommen habe.
    Ich bin gerade beim Thema Arrays und Vectoren.
    Ich sollte als Aufgabe eine Konsolenanwendung schreiben, in der der Benutzer mehrere Zahlen eingeben kann. Wieviel, steht vorher noch nicht fest. Also Arrays wären da nicht sinnvoll. Wenn der Benutzer eine negative eingabe macht, soll die Schleife beendet werden, und alle Zahlen in umgekehrter Reihenfolge ausgeben. Ich dachte mir, das sei kein Problem, aber ich scheiter an einem Punkt.
    (Ich benutze Visual Studio 2010)

    Hier das Programm

    Quellcode

    1. #include<iostream>
    2. #include<vector>
    3. using namespace std;
    4. int main() {
    5. cout << "Geben sie positive Zahlen ein. Bei eingabe einer negativen Zahl gibt das Programm ihre eingegebenen Zahlen wieder aus." <<endl;
    6. vector<int> v;
    7. int i=0;
    8. int x=1;
    9. while(0==0) {
    10. cout << "Geben sie eine Zahl ein" <<endl;
    11. cin >> x;
    12. if(x>=0) {
    13. v.push_back(x);
    14. i++;
    15. }
    16. else {
    17. break;
    18. }
    19. }
    20. while(i>=0) {
    21. cout << v[i] <<endl;
    22. i--;
    23. }
    24. }
    Alles anzeigen

    Das Problem liegt bei folgendem

    Quellcode

    1. while(i>=0) {
    2. cout << v[i] <<endl;
    3. i--;
    4. }

    Ich kann ganz normal Debuggen, doch wenn der dann an diese Stelle kommt, dann gibt das Problem folgende Fehlermeldung in einem neuen Fenster:

    Debug Assertion Failed!

    Program; ...s\visual studio 2010\Projects\ganzzahlen\Debug\ganzzahlen.exe
    File: c:\program files\microsoft visual studio 10.0\vc\include\vector
    Line: 932

    Expression: vector subscript out of range

    For information on how your program can cause an assertion failure, see the Visual C++ documentation on asserts.

    (Press Retry to debug the application)


    Wenn ich in der Schleife vorher einen Wert für i definiere, also
    i=3;
    dann zeigt das Programm eben den 3. Wert vom Vector.
    aber i hat doch schon einen Wert, ich habe den auch probeweise mal ausgeben lassen. Ich habe ganz viel ausprobiert, auch mit einer if else anweisung innerhalb der Schleife, oder die Ausgabe in void verpackt.
    Oder ist die Software von Microsoft beschädigt?
    Denn logisch ist das Programm allemal.
    Oder gibt es da noch einen Hinweis, der in meinem Buch nicht beschrieben ist?
  • so, jetzt habe ich den Code mal unter linux ausgeführt, mit dem g++, und das klappte wunderbar. Nur das ich vor dem break noch ein i-- brauchte, oder i gleich mit -1 definiere, denn in der schleife kommts einmal zuviel.
    Aber warum geht das in visual studio nicht?
    Kann jemand anders mal ausprobieren, obs bei ihm geht?
  • Habs unter winXP mit Code::Blocks und gcc probiert, geht auch wunderbar.
    Will ja keinen Flamewar ausbrechen lassen, aber VisualC++ ist kaputt und bringt sehr schlechte Fehlermeldungen...

    Da du es ja lernst hab ich mal schnell über deinen Code gesehen, bissel was verbessert und kommentare hinzugefügt.

    Quellcode

    1. #include<iostream>
    2. #include<vector>
    3. using namespace std;
    4. int main(void) //Darüber lässt sich streiten, aber ich vertrete die meinung das man bei Funktionsdefinitionen mit leeren parametern ein void schreiben sollte
    5. {
    6. cout << "Geben sie positive Zahlen ein. Bei eingabe einer negativen Zahl gibt das Programm ihre eingegebenen Zahlen wieder aus." << endl;
    7. vector<unsigned int> v; //bessere definitionen des Typs sind meinesachtens besser. Hier ist fest definiert, das NIE ein negativer wert vorkommt
    8. unsigned int i = 0;
    9. signed int x = 0; //Allgemein, ein leerzeichen zwischen zahl und rechenoperator lässt sich wesentlich besser lesen
    10. do
    11. {
    12. cout << endl << "Geben sie eine Zahl ein" <<endl;
    13. cin >> x;
    14. if(x >= 0)
    15. {
    16. v.push_back(x);
    17. i++;
    18. }
    19. } while(x >= 0); //Do-While ist denke ich angebrachter
    20. cout << endl << endl << "Ausgabe: " << endl;
    21. while(i > 0)
    22. {
    23. cout << v[--i] <<endl; //ob das nicht evtl verwirrt weiß ich nicht, ich komm damit klar
    24. }
    25. return 0; //0 returnen nicht vergessen! Das bedeutet das dein Programm ohne Probleme beendet wurde
    26. }
    Alles anzeigen


    Du wirst beim einrücken, formatieren von deinem Code immer von irgendwem kritik bekommen, weil es jeder ein wenig anders macht. Davon darfst du dich nicht beirren lassen!
  • Danke, mit deiner Variation funktioniert es auch bei Visual studio.
    was würdest du denn empfehlen? Einfach nur C++?
    Gibt es dort ein gutes Buch oder ähnliches?
    Ich will dieses Jahr eine Ausbildung zum Fachinformatiker machen, und da tut sich das in der Bewerbung gut, wenn man schon ein wenig Vorkenntisse hat.
  • pocky schrieb:

    Habs unter winXP mit Code::Blocks und gcc probiert, geht auch wunderbar.
    Will ja keinen Flamewar ausbrechen lassen, aber VisualC++ ist kaputt und bringt sehr schlechte Fehlermeldungen...

    Was fürn quatsch, hast du nun doch einen ausgelösst.
    Sorry, aber dass ist deine subjektive Meinung und weil du die Fehlermeldungen nicht verstehst, heisst es nicht dass der Compiler und die IDE schlecht sind, zu mal dies keine wirkliche Fehlermeldung vom Compiler ist, sonder vom Debugger eher eine Warnung.

    rhermann schrieb:

    so, jetzt habe ich den Code mal unter linux ausgeführt, mit dem g++, und das klappte wunderbar. Nur das ich vor dem break noch ein i-- brauchte, oder i gleich mit -1 definiere, denn in der schleife kommts einmal zuviel.
    Aber warum geht das in visual studio nicht?
    Kann jemand anders mal ausprobieren, obs bei ihm geht?

    Unter Windows geht der Code auch, nur kriegst du mit deinen Zeilen eine Zugriffsverletzung (Zugriff auf ein nicht exestierendes Objekt im vector) und der Debugger von Microsoft überpürft dies halt (kann man glaub ich irgendwo abstellen) und da du unter Linux keinen (oder einen schlechten) Debugger verwendest sagt der mal gar nichts und per Zufall läuft dein Programm.

    Sorgt dafür dass dein i im gülltigen Bereich operiert:

    Quellcode

    1. // Um eins verkleiner da sonnst Index über derLänge liegt.
    2. --i;
    3. while(i>=0) {
    4. cout << v[i] <<endl;
    5. --i;
    6. }

    oder

    Quellcode

    1. for (i=v.size()-1; i>=0; --i)
    2. {
    3. cout << v[i] <<endl;
    4. }

    oder, oder, oder ....

    Mfg Rushh0ur