[C] Function pointer - korrekte Nutzung
lima-city → Forum → Programmiersprachen → C/C++ und D
adresse
anmerkung
argument
aufruf
code
compiler
dank
definition
deklaration
einleiten
ergebnis
funktion
hinweis
parameter
pointer
runden klammern
unterschiedlichen aufrufen
url
verwendeten aufruf
zeiger
-
Hallo,
ich habe eine Frage zu Funktionspointer in C.
Die Definition sieht ja so aus:
void function1(char *attr1, int attr2, void* (*pointerfunc)(int i));
Das würde heißen: Die Funktion function1 nimmt einen Funktionspointer pointerfunc entgegen, dessen Funktion einen void-Pointer returned, korrekt?
Wäre es jetzt nicht falsch, mit dieser Funktion:
void* somefunction(int i) { ... }
diesen Funktionsaufruf zu machen?
function1(bla1, bla2, somefunction(10));
Müsste ich nicht, da ich die Adresse der somefunction-Funktion will, entweder beim Aufruf ein & hinzufügen, oder aber bei der Deklaration der Funktion ein *, also ein
machen?void* (*somefunction)(int i) {...}
Ist meine Überlegung richtig? Denn in vielen Beispielen im Internet wird der obige Weg benutzt, nie wird genau drauf eingegangen, was nun richtig ist, bzw ob alle Möglichkeiten funktionieren.
Danke im Vorraus,
madhouse
PS: Und kann ich den Paramenter int i überhaupt so übergeben, weil ein Pointer ja normal nicht wirklich ein Parameter halten kann. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Der korrekte Funktionsaufruf ist:
function1(bla1, bla2, somefunction);
Das du ja die Adresse der Funktion übergeben musst.
In der function1 kannst du dann so auf diese übergebene Funktion aufrufen:
(*pointerfunc)(10);
Und nein, der Parameter kann nicht bei dem Zeiger mit übergeben werden -
Hallo madhouse,
wenn Du eine Funktion
hast, dann ist die Adresse der Funktion einfach der Funktionsname. Also ohne '&' davor und ohne die runden Klammern mit dem/den Argument/en.void* somefunc(int i) { ... }
Der Aufruf von function1() muss wie folgt aussehen:
Bei dem von Dir verwendeten Aufruf würde erst somefunc() ausgeführt und das Ergebnis, d.h. der void-Pointer der von somefunc() zurückgegeben wird, an function1() übergeben und nicht die Adresse der Funktion.function1(bla1, bla2, somefunc);
Edit: Mir scheint, dass die 'Es wurde ein neuer Beitrag erstellt'-Meldung defekt ist.
Aber eine Anmerkung habe ich noch:
Du kannst in function1() anstelle von
auch einfachfoobar = (*pointerfunc)(10);
schreiben.foobar = pointerfunc(10);
Beitrag zuletzt geändert: 30.11.2011 15:29:01 von darkpandemic -
Danke für die Hinweise, jetzt wird das ganze schon klarer.
darkpandemic schrieb:
Bei dem von Dir verwendeten Aufruf würde erst somefunc() ausgeführt und das Ergebnis, d.h. der void-Pointer der von somefunc() zurückgegeben wird, an function1() übergeben und nicht die Adresse der Funktion.
Oh ja stimmt, das war etwas dämlich ;)
Zusammenfassend kann ich sagen, das egal ob
odervoid* (*somefunc)(params) {...}
für die Definition der Funktion verwendet wurde, ich sie immer mitvoid* somefunc(params) {...}
aufrufe und innerhalb der function1 mitfunction1(bla1, bla2, somefunc);
oderfoobar = (*somefunc)(10);
benutzen kann?foobar = somefunc(10);
Also muss ich da komplett vom Variablendenken wegkommen und es gibt keinen Unterschied zwischen den unterschiedlichen Aufrufen?
-
Hallo madhouse,
nicht ganz richtig:
Das ist die Deklaration eines Zeigers:
und das ist die Deklaration einer Funktion:void* (*somefunc)(params);
Ich denke mal, dass Dein Compiler sowas nicht mögen wird:void* somefunc(params);
weil ein Zeiger keinen Funktions-Definition einleiten kann. Es geht nur:void* (*somefunc)(params) { ... }
void* somefunc(params) { ... }
Edit: Typo
Beitrag zuletzt geändert: 30.11.2011 15:52:44 von darkpandemic -
Hallo darkpandemic,
vielen Dank für die Hilfe,
ich hab gerade nochmal bisschen damit rumgespielt und würde jetzt behaupten wollen, es begriffen zu haben ;)
Edit: Natürlich auch an thomasba, wie ich das mit den Argumenten mache, ist auch auf jeden Fall hilfreich
Gruß,
madhouse
Beitrag zuletzt geändert: 30.11.2011 16:05:26 von madhouse -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage