Vector subscript out of range...
-
Abend,
Ich arbeite mich wie immer durch ein paar Übungen, nun happerts bei den "Vektoren"
Aufgabe: Der Benutzer gibt unendlich viele Zahlen ein. Mit der Eingabe einer negativen Zahl soll das Programm die eingegebenen Zahlen in umgekehrter Reihenfolge ausgeben.
Problem: Beim debuggen findet er keine Fehler, ich gebe 4 Zahlen ein und anschließend eine negative Zahl. Bei der Eingabe der negativen Zahl kommt die Fehlermeldung: "Vector subscript out of range!"
Für mich unlogisch. Vektoren haben doch keine Feldbegrenzung oder nicht? Kann sein, dass ich da was missverstanden habe...
Würde mich sehr freuen, wenn mir jemand das Problem lösen könnte.
#include <iostream> #include <vector> using namespace std; int main() { int eingabe, zwsp=0; vector<int> felder; do { cout << "Gib eine Zahl ein! - ENDE -Zahl!" << endl; cin >> eingabe; felder.push_back(eingabe); } while(eingabe > 0); zwsp = felder.size(); for(unsigned int z=0; z <= felder.size();z++) { cout << felder[zwsp] << endl; zwsp-= 1; } }Lg Mentras
-
z < felder.size()
-
€dit: Besser formulieren:
Das war nicht der Fehler, das Programm stürzt weiterhin ab,... woran könnte es noch liegen?
-
zwsp = felder.size()-1;merke: in basic schreibt man feld(10) und hat 11 elemente, nämlich feld[0] bis feld[10]. in c++ schreibt man feld[10] und hat nur die 10 elemente von feld[0] bis feld[9].
also dein höchter erlaubter index vom vector ist immer nur v.size()-1
-
Puhh,... das gute ist, ich lerne was bei dir während du mir die Fehler ansagst.
Ich wunder mich, dass ich soooviele Fehler drin habe, bin davon ausgegangen dass es nur einer ist...
Komischerweise funktioniert es noch immer nicht...
do { cout << "Gib eine Zahl ein! - ENDE -Zahl!" << endl; cin >> eingabe; felder.push_back(eingabe); } while(eingabe > 0); zwsp = felder.size(); for(unsigned int z=0; z < felder.size();z++) { cout << felder[zwsp] << endl; zwsp = felder.size() - 1; } }So sieht es jetzt aus, hab ich was falsch verstanden oder ist da noch ein Fehler?
P.S.: Danke, hab gedacht in C++ ist das auch so...^^
-
Da hst du mein Posting nicht in meinem Sinne interpretiert.
Mein Sinn:#include <iostream> #include <vector> using namespace std; int main() { int eingabe, zwsp=0; vector<int> felder; do { cout << "Gib eine Zahl ein! - ENDE -Zahl!" << endl; cin >> eingabe; felder.push_back(eingabe); } while(eingabe > 0); zwsp = felder.size()-1; //Hier ein -1 dazu for(unsigned int z=0; z < felder.size();z++) //Hier < statt <= { cout << felder[zwsp] << endl; zwsp-= 1; //Hier nix geändert } }Es kann natürlich sein, daß noch mehr Fehler drin sind. Das waren nur die, die ich sehe, ohne es bei mir auszuprobieren.
-
Dank dir Volkard

Funktioniert !
Lg Mentras
-
Wenn ich jetzt raten müßte, würde ich vermuten, daß Du schon recht lange Basic machst, vermutlich schon länger als ein Jahr. Und wenn ich sagen dürfte, was ich vermute, würde ich sagen, was mich vermuten läßt, daß Du schnell ein Lisp-Buch zwischenschieben solltest, bevor Du dich weiter mit C++ beschäftigst.
-
Joah, da liegst du nicht falsch.
Wie ist das mit einem Lisp-Buch gemeint? Lese z.Z. http://www.galileocomputing.de/katalog/buecher/titel/gp/titelID-1787
Also alles von Anfang an...^^
-
Meine Variante:
#include <iostream> #include <vector> using namespace std; int main() { int eingabe; int zwsp=0; vector<int> felder; while(eingabe != 0) { cout << "Gib eine Zahl ein! - ENDE -Zahl!" << endl; cin >> eingabe; if(eingabe == 0) break; felder.push_back(eingabe); } for(unsigned int z = 0; z < felder.size(); z++) { cout << felder[z] << endl; } }Ich würd mal eher den Code verwenden.
Dein Code:
#include <iostream> #include <vector> using namespace std; int main() { int eingabe, zwsp=0; //ein wenig unübersichtlich, aber das ist Geschmackssache vector<int> felder; do { cout << "Gib eine Zahl ein! - ENDE -Zahl!" << endl; cin >> eingabe; felder.push_back(eingabe); //auch die negative Zahl wird eingegeben, was ist wenn ich das nicht will? } while(eingabe > 0); zwsp = felder.size(); //wofür diese variable anlegen? for(unsigned int z=0; z <= felder.size();z++) //du hast doch hier z um durch den vector zu laufen { cout << felder[zwsp] << endl; //hier z einsetzen zwsp-= 1; //wird somit überflüssig } }
-
Mentras schrieb:
Wie ist das mit einem Lisp-Buch gemeint?
Damit ist gemeint, daß Du dir auf amazon.de einen Account einrichtest, das beste Lisp-Buch für Dich, was du findest, auf den Wuschzettel stellst, mir einen Link auf deinen Wunschzettel gibst und ich bezahle Dir das Buch (ist jetzt das einfachste Protokoll, das sicherstellt, daß ich von Dir weder Namen noch Wohnort erfahre, will ich auch gar nicht wissen).
-

Ein Account auf Amazon hab ich. Aber wieso willst du mir ein Buch kaufen? oO Ich kenn Dich kaum
Ist nicht böse gemeint, jedoch kommt mir das merkwürdig vor...Lg Mentras
P.S.: FreakY<3Cpp, danke für deinen Code muss mich noch an einem Schreibstil gewöhnen... In VB hat für mich die IDE alles gemacht...^^
Du hast auch Recht, hab unnötige Variablen definiert... dauert halt noch etwas,...
-
Mentras schrieb:
Aber wieso willst du mir ein Buch kaufen?
Weil ich einfach den unbestimmten Eindruck habe, daß aus Dir mal ein ganz großer Informatiker wird und ich mit dieser Intervention Dich auf einen Hops vielleicht zwei Jahre weiterbringen kann (und vom frühzeitegen Gamecoden abbringen).
Mentras schrieb:
oO Ich kenn Dich kaum
Ist nicht böse gemeint, jedoch kommt mir das merkwürdig vor...Klar ist das merkwürdig. Deswegen bestehe ich ja drauf, daß ich deine persönlichen Daten nicht erfahre.
Wenn Du denkst, es diene nur dazu, Dir eine Falle zu stellen, denk Dir einfach ein anderes Protokoll aus, zum Beispiel als Lieferadresse dein Anwalt, oder bitte den örtlichen Bademeister, daß er als Treuhänder fungiert und das Päckchen annimt.
-
Mentras schrieb:
P.S.: FreakY<3Cpp, danke für deinen Code muss mich noch an einem Schreibstil gewöhnen... In VB hat für mich die IDE alles gemacht...^^
Falls es um die Einrückung geht, viele C++-IDEs machen das aus Anfrage.
Zum Beispiel microsoftige machen das mit Strg+A (alles markieren) und dann Alt+F8 (Markierung verhübschen).
-
volkard, ich hab eben mit C# angefangen, kaufste mir ein Buch ? :p
-
FreakY<3Cpp schrieb:
Meine Variante:
[...]
Ich würd mal eher den Code verwenden.Dein Code:
[...]Dann solltest du aber noch dazusagen (wenn ich mich gerade nicht sehr vertue), dass dein Code semantisch nicht ganz identisch ist, weil sein alter Code den vector rückwärts und deiner vorwärts ausgibt.
Felix
-
volkard schrieb:
Mentras schrieb:
Aber wieso willst du mir ein Buch kaufen?
Weil ich einfach den unbestimmten Eindruck habe, daß aus Dir mal ein ganz großer Informatiker wird und ich mit dieser Intervention Dich auf einen Hops vielleicht zwei Jahre weiterbringen kann (und vom frühzeitegen Gamecoden abbringen).
Huch, das find ich echt nett!! oO
Dafür muss ich mich natürlich revanchieren,...Könnten wir privat reden? ^^ Ist etwas freizügig für mich

Falls du ICQ hättest: 378105535
Lg Mentras
P.S.: Phoemuex, der Code von FreakY<3Cpp stimmt schon
In diesem Abschnitt:zwsp = felder.size()-1; for(unsigned int z=0; z < felder.size();z++) { cout << felder[zwsp] << endl; zwsp-= 1; }Wird alles von hinten nach vorne ausgegeben.
-
Na gut, wenn man unbedingt will, dass die Zahlen rückwärts ausgegeben werden, dann könnte man die for-Schleife so machen:
for(unsigned int z = felder.size(); z > 0; z--) { cout << felder[z-1] << endl; }
-
FreakY<3Cpp schrieb:
Na gut, wenn man unbedingt will, dass die Zahlen rückwärts ausgegeben werden, dann könnte man die for-Schleife so machen:
for(unsigned int z = felder.size(); z > 0; z--) { cout << felder[z-1] << endl; }Dein Code hat funktioniert... Er gibt die Zahlen rückwärts aus.