sizeof und pointer
-
kommt drauf an was du machen willst
-
DrGreenthumb schrieb:
nein, ist nicht möglich.
klar ist das möglich
short s = 1; void *p; p = &s; printf("%d",sizeof(s)); return 0;
-
Koennte sein, dass der Compiler bei p = &s; eine Warning ausspuckt. Also
short *p;
-
Könnte sein, wäre aber unsinnig bzw. falsch. & ist der Adressoperator.
Eine Warung wäre eher bei der Zeile "printf("%d",sizeof(s));" angebracht.
-
MBCS-CITP schrieb:
Koennte sein, dass der Compiler bei p = &s; eine Warning ausspuckt.
nee, eigentlich nicht.
aber darum gings hier ja nun gar nicht
-
hab das problem jetzt gelöst indem ich die typen in einem extra array gespeichert habe... läuft ganz gut...
nun muss ich aber ungefähr das gleiche für funktionen bauen... dazu hab ich mir folgendes ausgedacht:void *pFunc; pFunc = printf; // &printf -> funktioniert genauso wenig (*pFunc)("hallo welt");
leider geht das nicht... aber so muss es gehen ^^
das funktioniert:int (*pFunc)(const char*,...); pFunc = &printf; (*pFunc)("hallo welt");
das funktioniert ... aber ich will die ganzen typen nicht angeben...
kann man das nicht auch irgendwie anders?
-
Nein, zum Funktionsaufruf brauchst Du eine Funktion, nicht einen Zeiger auf irgendwas.
-
ich glaube ein funktionszeiger lässt sich nicht legal in einem void* speichern. Du musst ja aber beim Aufruf eh wissen, wie man die Funktion aufruft.
ich würde die Zeiger in einem struct speichern:
struct Typ1 { int type; void(*func)(); }; struct Typ2 { int type; int(*func)(int, char, ...); }; ...
Zeiger auf die structs kannst du untereinander rumcasten bzw. in void* speichern.
-
Du kannst quasi jeden Zeiger als generischen Funktionszeiger einsetzen, Du mußt nur vor Funktionsaufruf zurück-casten.
Bsp (kann man auch klammernärmer schreiben):
void foo(char *str) { puts(str); } int main(void) { void (*fp)(void); /* generischer funktionszeiger */ fp = (void(*)(void))(foo); . . . (*(void(*)(char*))fp)("foo"); }
Du kannst einen generischen Funktionszeiger *nicht* aufrufen, ohne ihn auf den richtigen Typen gecastet zu haben. Wenn Du sowas brauchst, solltest Du dich fragen, ob C das richtige Werkzeug für dich ist.
-
Daniel E. schrieb:
void (*fp)(void); /* generischer funktionszeiger */
oh
dann braucht man nur einen einzigen struct.
-
..., solltest Du dich fragen, ob C das richtige Werkzeug für dich ist.
Ich glaube schon,... ich habe schon ein paar Sprachen ausprobiert.
Also ich habe jetzt ein sogenannten "CVariableContainer" gebastelt... Mit diesem lassen sich Variablen hinzufügen und setzen. Egal welchen Typus kann man die als Bool,String oder Int benutzen.
Nun brauch ich ein halbwegs gleiches Gegenstück... ein Container wo ich Funktionen speichern kann:CFuntionContainer cont; cont.AddFunction(Int,"Wrap_printf",&printf,...);
irgendwie so... und nun muss ich ja einen Variablen Typ für das 3. Argument angeben... und irgendwie auch "Wrap_printf"s Routine speichern... und da ist mein 14-jähriger Kopf am streiken
Das ganze wird dann noch auf einem CConstantContainer erweitert etc.
Damit lässt sich dann hoffentlich ganz leicht ein Interpreter basteln.
mfg