Hallo Liste, gibt es (in C ) eine moeglichkeit den datentyp einer variablen festzustellen ? Danke Gruss Oli
Moin,
* Oli Weiss
gibt es (in C ) eine moeglichkeit den datentyp einer variablen festzustellen ?
Wie ist denn der verlorengegangen? In einer Struktur kannst Du einen String speichern, der den Typ enthält. Die Klassen in Motif machen das so. Thorsten -- We are in the midst of an age of plenty, where the powerful try to engineer false scarcity to protect their roles as useless middlemen. - Glass of Water
gibt es (in C ) eine moeglichkeit den datentyp einer variablen festzustellen ?
Zur Laufzeit AFAIK nicht. Hast Du kompilierbaren Code, dann muss jede Variable auch irgendwo deklariert sein und da wird ihr Typ notiert. Was ist denn konkret das Problem? -- 1 Bodo Kaelberer 123 http://www.webkind.de/ 3 4 "A button I have made must be pushed." (ip)
Hallo Liste,
gibt es (in C ) eine moeglichkeit den datentyp einer variablen festzustellen ?
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 - wie organisiere ich die Parameterliste bei deklaration bzw. definition der Funktion (auch hier wieder der Datentyp) Ich weis, hoert sich nach ziemlichem VooDoo an - aber es war halt ne Idee und obendrein wollt ich halt nicht fuer jeden Datentyp und fuer jede Anzahl der Dimensionen eine eigene Funktion schreiben. (zb. int,float,double jeweils fuer 1,2 o. 3 dimensionen = 9 Funk.) Naja, ich Sinn noch eine wenig darueber nach. Danke & Gruss
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. 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.
- 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. Probier es mal aus (-: Bye -- 1 Bodo Kaelberer 123 http://www.webkind.de/ 3 4 "A button I have made must be pushed." (ip)
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
participants (3)
-
Bodo Kaelberer
-
Oli Weiss
-
Thorsten Haude