dynamisches Array
-
Das Programm soll ein Array beinhalten, dass nur so groß ist, je nach dem wieviel Eingaben gemacht wurden. Bei jeder Eingabe soll das Array ein Feld größer werden.
// Berechne Anzahl Unterm Schnitt.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung. // #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) { int schueler=0; //float zensuren[20]; //float* pzensuren; float zensurengesamt=0; /* cout << "Anzahl der Schueler eingeben:" << "\n"; cin >> schueler; */ float *pzensuren=new float[1]; cout << "Eingabe der Zensuren:" << "\n"; while(pzensuren[schueler-1]!=0) { float *ptemp=new float[schueler]; cin >> pzensuren[schueler]; ptemp = pzensuren; //delete[] pzensuren; float *pzensuren=new float[schueler]; pzensuren = ptemp; //delete[] ptemp; zensurengesamt += pzensuren[schueler]; for(int i=0; i<=schueler; i++) { //cout << ptemp[i] << "\n"; cout << pzensuren[i] << "\n"; } schueler+=1; } /* zensurengesamt /= schueler; cout << "Ausgabe der Noten die schlechter sin als die Durchschnittsnote:" << "\n"; for(int i=0; i<schueler; i++) { if(pzensuren[i]>zensurengesamt) { cout << pzensuren[i] << "\n"; } } cout << "Durchschnittsnote:" << "\n"; cout << zensurengesamt << "\n"; */ delete[] pzensuren; getch(); return 0; }
Wenn ich jetzt das temp oder zensuren array löschen will funktioniert das Programm nicht mehr. Woran liegt das?
-
Hi!
Du hängst den Speicher nicht an, du reservierst neuen und lässt dann die Zeiger auf andere Speicherbereiche zeigen. Um das zu realisieren gibt es glaube ich nur die Möglichkeit jedesmal wenn das Array 1 Element größer wurde, ein neues Feld mit der Größe alteFeldgroesse+1 zu erstellen, dann das alte in das neue zu kopieren und dann den Speicherbereich des alten löschen und den Zeiger des alten auf das neue zu legen, denn der andere Zeiger ist ja nur ein temproärer Zeiger.
Also so:
std::size_t i = 1; float* feldZeiger = new float[i]; // Schleifen-Anfang float* tmp = new float[++i]; // copieren der elemente von feldZeiger nach tmp delete[] feldZeiger; feldZeiger = tmp; // Schleifen-Ende
Ich benutze einfach eine Laufvariable die die Anzahl Elemente enthält, dann braucht man nicht jedesmal die Anzahl erneut ermitteln.
Auf jedenfall hat dein Programm so wie es jetzt ist, nur Speicherlecks und kannst du so wegwerfen.
Achja, du bist außerdem im falschen Forum. Du schreibst C++-Code, befindest dich aber im ANSI-C-Forum. Aber ein Mod wird den Thread sicher für dich nach C++ verschieben.
Code-Hacker
-
Dieser Thread wurde von Moderator/in Shade Of Mine aus dem Forum ANSI C in das Forum C++ verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.