Voidzeiger in Funktionszeiger umwandeln, geht das ?
-
Hello !
Kann man einem Zeiger auf void die Adresse einer Funktion zuweisen und diese Funktion aufrufen ?
So wie ich es versucht habe, klappt es leider nicht. Die Stellen mit den Fehlermeldungen des Compilers habe ich kommentiert.int hello_int( void ) { puts("hello int"); return 1; } double hello_double( void ) { puts("hello double"); return 1.0; } int main ( int argc, char* argv[] ) { void* pfunc=NULL; int (*a)(void) = NULL; double (*b)(void) = NULL; int iNum; double dNum; a = hello_int; iNum = a(); // ok b = hello_double; dNum = b(); // ok pfunc = a; iNum = pfunc(); // error 'pfunc' not a function (int(*)(void) )pfunc = a; // versuche zu casten iNum = pfunc(); // error 'pfunc' not a function return 0; }
-
pfunc = a; iNum = ((int(*)(void))pfunc)();
-
casting-freak schrieb:
pfunc = a; iNum = ((int(*)(void))pfunc)();
boah, krass
funzt
vielen dank
-
casting-freak schrieb:
pfunc = a; iNum = ((int(*)(void))pfunc)();
das casten funktioniert eins a.
warum kann ich denn diese syntax nicht benutzen, um einen zeiger auf eine funktion als rückgabetyp anzugeben?
so gehts nicht:int func(void) { return 1; } ((int(*)(void)) return_function_pointer() { return func; }
obiges wird mit syntax error : 'type' angemeckert.
wie müsste ich den rückgabetypen deklarieren ?
-
function pointer NooB schrieb:
((int(*)(void)) return_function_pointer() { return func; }
int (*return_function_pointer(void))(void) { return func; }
-
fp->freak schrieb:
int (*return_function_pointer(void))(void) { return func; }
cool, danke. schreibst du das alles so aus dem kopf hin oder hast du ein besseres buch als ich ?
int func(void) { return 1; } int (*return_function_pointer(void)) (void) { return func; }
warning C4550: expression evaluates to a function which is missing an argument list
muss ich die warnung ernst nehmen oder ist das egal ? ich will ja bloß nen funktionszeiger zurückgeben, da brauche ich doch keine argumentenliste ?
ich schätze, damit ist die parameterliste gemeint ?
-
fp->nOOb schrieb:
cool, danke. schreibst du das alles so aus dem kopf hin oder hast du ein besseres buch als ich?
das war aus'm kopf, aber offensichtlich falsch denn sonst würdest du keine warning sehen.
-
hier http://209.85.129.104/search?q=cache:VjlATUZNBasJ:www.ee.hm.edu/fb/lab/lmc/kri-skripten/prog1/vorles/Ad540.doc+rückgabe+zeiger+auf+funktion&hl=de&ct=clnk&cd=2&gl=de
machen die das auch so: int (* pGift (char) ( int)
hmm...dann spinnt mein compiler wohl
-
fp->nOOb schrieb:
warning C4550: expression evaluates to a function which is missing an argument list
muss ich die warnung ernst nehmen oder ist das egal ? ich will ja bloß nen funktionszeiger zurückgeben, da brauche ich doch keine argumentenliste ?
ich schätze, damit ist die parameterliste gemeint ?Die warnung ist in dem Fall egal, aber häufger hat man, wenn nur die Funktion dasteht, ja die Klammern vergessen, wenn die Funktion keine Parameter hat (ist mir schon oft passiert). Die Warnung sollte verschwinden, wenn du den Funkionszeiger explizit ermittelst, anstatt dich auf die implizite Konvertierung zu verlassen:
return &func;
-
camper schrieb:
return &func;
ja, die warnung verschwindet
aber ich kapier nicht, wieso man das einfach so schreiben darf.ist denn func nicht schon der zeiger ?
bei qsort z.b. wird ja auch nur z.b. compare und nicht &compare übergeben.
-
jUsT AnOtHeR ProGGeR schrieb:
ist denn func nicht schon der zeiger ?
Der Ausdruck func ist ein "function designator", der Typ ein Funktionstyp: int(void)
Außer bei Anwendung der sizeof Operators (was dazu führt, dass die Anwendung von sizeof ein Fehler ist) und des Adressoperators & wird dieser Ausdruck implizit in einen Funktionszeiger umgewandelt. Das ist ganz ähnlich zu Array-Ausdrücken, die ebenfalls beim geringsten Anzeichen von Gefahr in Zeiger zerfallen.In C++ ist geht es etwas geordneter zu: Ausdrücke dieser Art haben Funktionstyp und sind lvalues (Postfixausdrücke, die nichtstatische Memberfunktionen bezeichen - x.memfun p->memfun - haben ebenfalls normalen Funktionstyp, sind aber rvalues und man kann daher keine Zeiger darauf bekommen) und es gibt eine implizite Konvertierung von lvalue-Funktionsausdrücken in rvalue-Zeiger auf Funktionen, zudem haben nur unäres & und der Funktionsaufrufoperator() Funktionsoperanden während sizeof die implizite Konvertierung unterdrückt.
Um es kurz zu machen, es ist egal, ob du func oder &func schreibst, &func tut nur explizit, was func ebenfalls tun würde. Wenn du Spaß daran hast und -Fetischist bist, kannst du auch &****&&&&&******func schreiben
-
camper schrieb:
In C++ ist geht es etwas geordneter zu...
deshalb sind function pointers in C++ so verdammt benutzerfreundlich und intuitiv. *grins*
btw, wenn unregs signaturen haben könnten, dann hätte ich mir jetzt diese eingesetzt:
C++ shows all signs of following the Harley Davidson Design Methodology - "If it breaks, make it bigger. If it sticks out, chrome it."