Fehler bei Vektorbenutzung. Wo liegt er genau?
-
Hallo Chummerz,
bin gerade dabei ein bisschen mit Vectoren zu spielen und habe mir mal eine alte Aufgabe genommen um dies dort zu Testen.
Es sollen n-Werte Eingegeben werden, diese sollen mit einer Zufallszahl addiert werden, danach erfolgt eine Ausgabe der eingegeben Werte und dann der neuen Werte (die addiert wurden).
Habe hier vorher mit Arrays gearbeitet, wo alles schön funktioniert hat, und wollte nun diese durch vectoren ersetzen. Da man bei Vectoren ja keine feste Größe hat.Bisher sieht der Quelltext so aus:
#include <iostream> #include <ctime> #include <vector> using namespace std; float eingabe(int n) { float eingabe; cout << "Bitte nun die " << n+1 << "te Zahl eingeben: "; cin >> eingabe; return eingabe; } int add() { int ar; srand(time(0)); ar = rand() % 9 + 1; return ar; } void ausgabe(vector<long double> a, vector<long double> b, int n) { cout << "Dies sind die eingegeben Werte mit einer Zufallszahl (von 1 - 9) Addiert." << endl; for (int i=0; i<n; i++) { cout << a << " "; } cout << endl; cout << "Dies sind die Ursprünglichen Werte." << endl; for (int i=0; i<n; i++) { cout << b[i] << " "; } cout << endl; } int main() { vector<long double> a, b; int n=0; cout << "Bitte die Anzahl an Zahlen eingeben: "; cin >> n; for (int i=0;i<n;i++) { a.push_back<i>=eingabe(i); } for (int i=0;i<n;i++) { b.push_back(i)=a.push_back<i>+add(); } ausgabe(a, b, n); return 0; }VS Express 2008 compiliert alles und führt auch das Programm aus, das Problem ist nur das ich bei der zweiten Wert eingabe einen Programmabbruch bekomme. Die Fehlermeldung lautet:
Debug Assertion Failed!
[i]Program: Vectorentest.exe*
File: blablub
Line: 779
Expression: vector subscript out of rangeHoffe mir kann jemand ein bisschen auf die Sprünge helfen... Mit der Erklärung die vom Programm kommt komm ich einfach nicht klar.
Danke schonmal im vor raus.
PS: Arbeite erst seit nem halben Jahr mit C++.
Edith: Habe es nun hibekommen das er das Programm normal durchstartet. Mit folgender Main geht es:
[cpp]int main()
{
vector<long double> a, b;
int n=0;
cout << "Bitte die Anzahl an Zahlen eingeben: ";
cin >> n;
for (int i=0;i<n;i++) { a.push_back(0); a[i]=eingabe(i); }
for (int i=0;i<n;i++) { b.push_back(0); b[i]=a[i] + add(); }ausgabe(a, b, n);
return 0;
}[cpp]Das hinzugefügte habe ich mal Fettmarkiert. Gibt es einen schöneren Weg dies hinzubekommen?
-
Das compiliert? Kann ich irgendwie gar nicht glauben. Du hast offenbar einen sehr toleranten Compiler.
Falls du etwas funktionierendes haben willst, das auf jedem Compiler funktioniert:
#include <iostream> #include <ctime> #include <vector> #include <cstdlib> // Für rand und srand. Inkludiere immer alle Standardheader die du brauchst. Verlass dich nicht darauf, dass andere Standardheader sie einbinden using namespace std; long double eingabe(int n) // Warum float, wenn du später long double benutzt? { long double eingabe; cout << "Bitte nun die " << n+1 << "te Zahl eingeben: "; cin >> eingabe; return eingabe; } int add() // Sehr ungünstig gewählter Name für eine Funktion, die eine Zufallszahl liefert { int ar; /* srand(time(0)); */ // Du hast falsch verstanden, was das macht. Guck dir nochmal an, wie rand und srand funktionieren ar = rand() % 9 + 1; return ar; } void ausgabe(vector<long double> &a, vector<long double> &b) // Wozu das n mitschleppen? Vectoren wissen wie groß sie sind // Außerdem sollte man größere Datenstrukturen besser per Referenz übergeben, wenn dir das schon was sagt. { cout << "Dies sind die eingegeben Werte mit einer Zufallszahl (von 1 - 9) Addiert." << endl; for (int i=0; i<b.size(); i++) { cout << b[i] << " "; } cout << endl; // Du hattest hier den Index i vergessen cout << "Dies sind die Ursprünglichen Werte." << endl; for (int i=0; i<a.size(); i++) { cout << a[i] << " "; } cout << endl; // Außerdem waren in a die unveränderten Werte und in b die veränderten } int main() { srand(time(0)); // Hier ist srand richtig aufgehoben vector<long double> a, b; int n=0; cout << "Bitte die Anzahl an Zahlen eingeben: "; cin >> n; for (int i=0;i<n;i++) { a.push_back(eingabe(i)); } // Was hier vorher stand, war total falsch. Unbedingt nochmal nachlesen wie das richtig geht for (int i=0;i<n;i++) { b.push_back(a[i]+add()); } // Arrg! Das wird ja immer schlimmer! Das musst du unbedingt nochmal von Anfang an lernen. ausgabe(a, b); return 0; }
-
Danke für deien Hilfe.

In der Schule haben wir leider nur Arrays behandelt bisher, und laut Lehrer werden wir auch keine Vectoren rein nehmen. Deswegen versuche ich mir das ein bisschen selbst bei zubringen.
Die Zufallsfunktion habe ich mir von einem anderen in der Schule Programmierten Programmgeklaut.
In meinem Buch werden vektoren leider auch eher Stiefmütterlich behandelt, sind da gerade mal mit 4 Seiten drin und es wird einem nur gesagt wie man erstellt, entfernt und anspricht.Hilft aber auf alle fälle schonmal sehr viel weiter

-
C++ ohne Vectoren, tststs. Das ist ja wie C ohne Zeiger. Ihr armen Schüler...
Ich würde dir ja einen Schulwechsel empfehlen, aber das ist wohl nicht realistisch :p .
Aber zumindest das Buch kann und sollte getauscht werden, wenn du dir keine schlechten Techniken angewöhnen willst.
-
Welches Buch würdest du denn Empfehlen? Es gibt schließlich eine ganze Latte von Büchern.
PS: Habe leider keine PM-Funktion gefunden.
-
Hier im Forum werden immer C++ Primer und Thinking in C++ empfohlen. Beide habe ich nie gelesen, daher kann ich nicht wirklich was dazu sagen. Ich habe C++ mittels C++ von A-Z gelernt, kann es aber nicht empfehlen.
Thinking in C++ gibt es auch als freies Ebook, daher sollte es kein Problem sein, da mal reinzugucken. Ist aber auf Englisch, ich weiß nicht ob dir das als Schüler so passt. Zum Programmieren wirst du aber früher oder später sowieso englische Texte fließend lesen können müssen.
-
Englisch geht so einigermaßen, vielen Dank für den Tipp.
Dann mal weiter ran setzen und gucken wie weit ich komm