Dynamisches Array zur Laufzeit füllen
-
Servus,
ich hab folgendes Problem:
ich möchte in einer Klasse Punkte im Raum in einem Array abspeichern und die Liste zur Laufzeit füllen. Auf das Array wird über einen Pointer zugegriffen.
Die "füll"funktion sieht nach folgendem Schema aus:void Object3d::addPoint(Point3d _punkt){ Point3d *buffer[1]; //Wenn noch kein Punkt angelegt ist, dann braucht die Liste nicht gerettet zu werden if(points == 0){ *objPoints = (Point3d*) malloc(sizeof(Point3d)); *objPoints[0] = _punkt; points++; return; } //HINWEIS: points wird erst am Ende erhöht //-> Somit zeigt points auf das letzte Element der NEUEN liste! //der Puffer soll so groß sein wie die alte Liste *buffer = (Point3d*) malloc(sizeof(Point3d) * points); for(int i = 0; i < points; i++){ *buffer[i] = *objPoints[i]; } free(*objPoints); //Neuen Spiecherplatz der Liste holen *objPoints = (Point3d*)malloc(sizeof(Point3d) * (points + 1)); for (i = 0;i < points; i++){ *objPoints[i] = *buffer[i]; } //Hier ist kommt er Fehler: *objPoints[points] = _punkt; points++; free(buffer); return; }
Nun das Problem: wenn die Liste leer ist wird der erste Punkt alut debugger Problemlos abgespeichert. Sobald ich aber den zweiten Punkt abspeicher möchte erscheint ein Fehler an der markieten Stelle: Unbehandelte Ausnnahme usw.
WARUM??
Kann man bei einem Pointer der auf eine Liste zeigt nicht mehr mit Indexnummern arbeiten???
Grüße
Cheesenhomer
-
Bevor ich antworte erstmal ein paar Fragem (im Quelltext als Komentar)
void Object3d::addPoint(Point3d _punkt){ Point3d *buffer[1]; // Was hat dieses Feld mit einem einzelnen eintrag für einen Sinn? if(points == 0){ *objPoints = (Point3d*) malloc(sizeof(Point3d)); // Wieso malloc? selbst bei einem POD würde ich zu new raten. *objPoints[0] = _punkt; points++; return; } *buffer = (Point3d*) malloc(sizeof(Point3d) * points); // wieder das selbe for(int i = 0; i < points; i++){ *buffer[i] = *objPoints[i]; // Sobal i > 0 ust ist das hier ein Fehler } free(*objPoints); *objPoints = (Point3d*)malloc(sizeof(Point3d) * (points + 1)); for (i = 0;i < points; i++){ *objPoints[i] = *buffer[i]; // buffer hat nur ein Element!!! } *objPoints[points] = _punkt; points++; free(buffer); return; }
-
Ein C-Programmierer der sich in C++ versucht!
Versuch mal die Klasse bzw. das Template std::vector. vector ist ein dynamisches Array in C++ und das malloc und free solltest du dir in C++ aus dem Kopf radieren. Das hat hier nichts zu suchen.
Infos zu vector gibts im Netz und hier reichlich im Forum, da jede Woche einer ankommt und ein dynamisches Array braucht.