dynamischer Vector hat irgendeinen Fehler
-
Moin! Habe folgenden Code und irgendwie stürzt das Programm immer ab (
Blackout? Bin ich jetzt vollkommen blind?). Beim Kompilieren wird kein Fehler angezeigt.
Hauptteil:
int main() { dynamicVector<int> a(5); a.addTop(9); a.addTop(2); a.addTop(3); a.addTop(4); a.addTop(5); a.addTop(6); a.addTop(7); a.addTop(8); a.addTop(1); a.addTop(10); return 0; }
Klasse:
template<class T> class dynamicVector { private: T *daten; int obersterIndex; int vectorgroesse; static const int erhoehen_um = 10; public: dynamicVector(); dynamicVector(int startgroesse); dynamicVector(int startgroesse, T wert); dynamicVector(const dynamicVector &andererVector); ~dynamicVector(); /* BLABLABLA */ }; template<class T> void dynamicVector<T>::addTop(T wert) { obersterIndex++; if(obersterIndex > vectorgroesse) { int neueGroesse = vectorgroesse + erhoehen_um; if(neueGroesse > vectorgroesse) { T *temp = daten; daten = new T[neueGroesse]; for(int i = 0; i <= obersterIndex; i++) daten[i] = temp[i]; delete [] temp; } else { std::cout << "\n\nFEHLER: Array wuerde verkleinert, nicht vergroessert"; std::cout << "\njetzige Groesse: " << vectorgroesse << " gewuenschte Groesse: " << neueGroesse << "\n\n"; } } daten[obersterIndex] = wert; }
Fehlermeldung:
Debug Error! Program: e:\Eigene Dateien\Programmierung\Projekte\test\Debug\test.exe DAMAGE: after Normal Block (#51) at 0x00322590. (Press Retry to debug the application)
-
for(int i = 0; i <= obersterIndex; i++) daten[i] = temp[i];
macht dir Probleme.
Ich würde dem Teil ohnehin eine eigene (private) Methode für sowas verpassen.
Undstatic const int erhoehen_um = 10;
ist auch nicht so das wahre.
-
Ohne jetzt den Ctor zu kennen, sollte der Code in der Schleife nicht so lauten:
for(unsigned int i = 0; i < vectorgroesse; ++i) ...
Caipi
-
finix schrieb:
for(int i = 0; i <= obersterIndex; i++) daten[i] = temp[i];
macht dir Probleme.
Ich würde dem Teil ohnehin eine eigene (private) Methode für sowas verpassen.hab ich ja, aber es funktioniert ja auch so nicht. außerdem hab ich das hier zur besseren veranschaulichung so gemacht
finix schrieb:
Und
static const int erhoehen_um = 10;
ist auch nicht so das wahre.
was stört dich dran?
bin kein softwareentwickler, sondern ein newbie, der in den osterferien mal endlich wieder zeit fand, n bissl zu programmieren (basierend auf volkards kurs)
Mr. B
-
Mr. B schrieb:
finix schrieb:
for(int i = 0; i <= obersterIndex; i++) daten[i] = temp[i];
macht dir Probleme.
Ich würde dem Teil ohnehin eine eigene (private) Methode für sowas verpassen.hab ich ja, aber es funktioniert ja auch so nicht. außerdem hab ich das hier zur besseren veranschaulichung so gemacht
Deswegen schrieb ich ja "macht dir Probleme"
Schau dir Caipis Post an,
temp geht nur bis temp[obersterIndex-2].Mr. B schrieb:
finix schrieb:
Und
static const int erhoehen_um = 10;
ist auch nicht so das wahre.
was stört dich dran?
bin kein softwareentwickler, sondern ein newbie, der in den osterferien mal endlich wieder zeit fand, n bissl zu programmieren (basierend auf volkards kurs)
nimm lieber "vectorgroesse *= alpha" bei alpha ~1,5..2
edit:
if(neueGroesse > vectorgroesse)
wozu das?
-
finix schrieb:
Deswegen schrieb ich ja "macht dir Probleme"
Schau dir Caipis Post an, temp geht nur bis temp[obersterIndex-2].
Oh... gute Idee... Hmmm, ich mach mir morgen mit frischem Verstand Gedanken darüber.
finix schrieb:
Mr. B schrieb:
finix schrieb:
Und
static const int erhoehen_um = 10;
ist auch nicht so das wahre.
was stört dich dran?
bin kein softwareentwickler, sondern ein newbie, der in den osterferien mal endlich wieder zeit fand, n bissl zu programmieren (basierend auf volkards kurs)
nimm lieber "vectorgroesse *= alpha" bei alpha ~1,5..2
Das hab ich allerdings nicht verstanden.
EDIT: Für DEIN EDIT: Das ist ja normalerweise ne separate Funktion. und das ist quasi der "schutzmechanismus".
-
int neueGroesse = vectorgroesse * 1.5;
-
finix schrieb:
int neueGroesse = vectorgroesse * 1.5;
Könnte man in Betracht ziehen.
-
Mr. B schrieb:
EDIT: Für DEIN EDIT: Das ist ja normalerweise ne separate Funktion. und das ist quasi der "schutzmechanismus".
Ja? Stimmt. Sicher ist sicher. Solltest aber vielleicht noch mal überprüfen ob dein "Schutzmechanismus" nicht versagt hat. Doppelt am besten, im Sinne der Qualität. Und diese Tests nach Möglichkeit auch noch mal verifizieren. Und dann... naja.. so weiter halt, ad nauseum
-
deswegen:
template<class T> void dynamicVector<T>::growTo(int neueGroesse) { if(neueGroesse > vectorgroesse) { T *temp = daten; daten = new T[neueGroesse]; for(int i = 0; i <= obersterIndex; i++) daten[i] = temp[i]; delete [] temp; } else { std::cout << "\n\nFEHLER: Array wuerde verkleinert, nicht vergroessert"; std::cout << "\njetzige Groesse: " << vectorgroesse << " gewuenschte Groesse: " << neueGroesse << "\n\n"; } }
da sollte es eigentlich funktionieren. Wenn ich dann irgendwann
dynamicVector<int> a(50); a.growTo(25);
mache, greift der Mechanismus ein. Oder hab ich da auch noch was falsch gemacht? Ich kann auf Anfrage die ganze Klasse posten. Ist nich soooooo lang. (echt nich)
Mr. B