Am 24.05.2003 um 12:10:35 schrieb Bodo Kaelberer:
Verlorengegangen ist er (datentyp) ueberhaupt nicht und Hintergrund fuer die Frage ist folgender: Ich schreib gerade ein paar Funktionen die Arrays mit den Dimensionen 1,2 oder 3 dynamisch allokieren und bin jetzt beim Thema free angelangt. Das wollte ich ganz allegemein loesen und hatte die Idee - "ich uebergebe der funktion den zeiger, diese ruft sich so lange rekursiv auf bis sie die hoechste dimension gefunden hat und gibt dann den speicher nacheinander fuer alle dimensionen frei".
Die beiden groessten Problem sind wohl: - woher weis ich den Datentyp
Den brauchst Du eigentlich nicht. Denn free wird immer ein Zeiger auf void uebergeben. Egal ob Du ein Array von ints oder von floats oder sonstwas freigibts. Entscheidet ist die Speicheradresse, auf die der Zeiger weist.
Jo, das is mir klar. Was mir in diesem Zusammenhang eher Sorgen bereitet ist, dass das array einen Datentyp hat und ich bei der Funktiondeklaration einen Datentyp fuer das Array angeben muss: int ***array2d = NULL; void myfree( void **array2d, int anz2dim ); ^^^^ ...das geht daneben - sagt auch gcc -Wall (warning) Obwohl, tun tuts ja ;-) ...hab ich versucht.
Entsprechend kannst Du auch ein mehr-dimensionales Array, also ein Array von Zeigern, als einzelne void*-Zeiger freigeben. Noetig ist lediglich, die Laenge des Arrays zu wissen. Und da weiss ich keine andere Moeglichkeit, als diese als Parameter zu uebergeben.
Ja, zu dem Schluss bin ich mittlerweile auch gekommen :-(
- wie organisiere ich die Parameterliste bei deklaration bzw. definition der Funktion (auch hier wieder der Datentyp)
Den Typ halte ich wie erwaehnt fuer egal. Eine allgemeine Freigabe hingegen ist nicht gerade trivial. Du brauchst einen Zeiger auf das Array, die Anzahl der Dimensionen sowie die Anzahl der Elemente fuer jede Dimension. Vielleicht so:
void freeArray( void* p, int dimensions, long elementsDim1, long elementsDim2, long elementsDim3 );
oder noch allgemeinermit einem Array fuer die Anzahl der Elemente:
void freeArray( void* p, int dimensions, long* elementsPerDimeension );
Rufst Du diese Funktion rekursiv auf und dekrementierst dabei dimensions und inkrementierst elementsPerDimeension, dann koennte IN ETWA das herauskommen, was Du suchst.
Das ist genau das was ich mir vorstelle.
Probier es mal aus (-:
Bin dabei und danke fuer Deine Antwort :) Gruss Oli
Bye
-- 1 Bodo Kaelberer 123 http://www.webkind.de/ 3 4 "A button I have made must be pushed." (ip)
-- Um die Liste abzubestellen, schicken Sie eine Mail an: suse-programming-unsubscribe@suse.com Um eine Liste aller verf?gbaren Kommandos zu bekommen, schicken Sie eine Mail an: suse-programming-help@suse.com