Hallo Zusammen
Wie kann ich in C einen Funktionszeiger an eine Funktion übergeben und
in der Funktion dann die Zeiger-Funktion aufrufen?
z.B.
Die API-Funktion Get_Socket() erwartet als parameter einen
Funktionszeiger listner:
bool Get_Socket(int type, int(*listner)(int socket));
Ich möchte diese API-Funktion nicht direkt aufrufen sondern durch meine
selbsterstellte übergeordnete Funktion aufrufen.
bool My_Get_Sockt(int type, int (*listner)(char socket))
{
return Get_Socket(type,(*listner)(socket));
}
Hat aber leider nicht funktioniert. Was mache ich falsh?
Danke im Voraus.
Hakan schrieb:> geht nicht! trotzdem Danke
doch das geht.
Dann hast du eben noch einen anderen Fehler.
Woraus wir lernen: Codeausschnitte zu posten ist meistens eine ganz
schlechte Idee. Poste so viel wie möglich, im besten Falle alles.
Hakan schrieb:> sorry! socket ist int
Warum sagt dann deine Funktion
bool My_Get_Sockt(int type, int (*listner)(char socket))
dass die Funktion, die sich hinter dem Pointer verbirgt einen char haben
will?
Grundsätzlich:
Wenn man mit Funktionspointern arbeitet, ist man IMMER gut beraten, sich
für den Typ einer Funktion einen Typedef zu machen.
1
// Get_Socket will einen Funktionszeiger auf eine Funktion, die
2
// einen int als Argument übernimmt und einen int als Returnwert liefert
3
//
4
// ALso dieser Datentyp, den wir mal LstnFnct nennen:
Hakan schrieb:> bool My_Get_Sockt(int type, int (*listner)(char socket))> {> return Get_Socket(type,(*listner)(socket));> }
So ruft man eine Funktion über einen Zeiger auf, das Dereferenzieren
könnte man sich aber auch sparen. Aber da kommt dann ein int raus,
Get_Socket will aber einen Funktionszeiger, zweitens ist socket hier
nicht definiert, kann listner also nicht als Parameter übergeben werden.
Das soll also bestimmt Get_Socket(type, listner) heißen, also der
Funktionszeiger übergeben werden.
Was ganz anderes: Das soll wohl auch "listener" heißen, falls es
abgeleitet von "listen" ist.
Hakan schrieb:> Danke für den Rat hat aber nicht geholfen.
Du machst das mit Absicht, oder? Meine arme Tischkante...
[x] Poste die Fehlermeldung
[x] Poste den tatsächlichen Code
Viele Grüße,
Simon
naja, eigentlich ist es schon halbwegs klar - vermute ich.
Ein Zeiger int(*listner)(int socket) ist nicht kompatibel zu einem
int(*listner)(char socket).
Man muß sich halt entscheiden können.
@Andreas:
Ja: listener anstatt Listner (Englisch halt: ist aber hier nicht
wichtig)
mit return Get_Socket(type,(*listner)(socket));
bekomme ich die Fehlermeldungen:
tcp_ip.cpp(170): error: #254: type name is not allowed
tcp_ip.cpp(170): error: #18: expected a ")"
:-(
Danke Trotzdem.
Hakan schrieb:> mit return Get_Socket(type,(*listner)(socket));> bekomme ich die Fehlermeldungen:
Und was kommt nu mit Get_Socket(type, listner)? Einzig eine Warnung
wegen nicht ganz kompatibler Zeigertypen (wegen char statt int) dürfte
kommen.
Hakan schrieb:> @Andreas:> Ja: listener anstatt Listner (Englisch halt: ist aber hier nicht> wichtig)>> mit return Get_Socket(type,(*listner)(socket));> bekomme ich die Fehlermeldungen:> tcp_ip.cpp(170): error: #254: type name is not allowed> tcp_ip.cpp(170): error: #18: expected a ")">> :-(>> Danke Trotzdem.
sag mal. Liest du auch was man dir schreibt
return Get_Socket(type, listner);
Der Pointer heisst listener. Und der wird an die nächste Funktion
weitergegeben. Aus, Ende. Mehr braucht es nicht.
Auch ein Funktionszeiger ist einfach nur ein Zeiger.
Hakan schrieb:> mit return Get_Socket(type,(*listner)(socket));
Das ist nicht das, was dir in der allerallerersten Antwort auf deine
Frage als Lösung vorgeschlagen wurde.
Viele Grüße,
Simon
Simon K. schrieb:> Das sieht AFAIK danach aus, als hättest du komische Zeichen in deiner .c> Datei.
Genau. Runde Klammern und Sterne an stellen wo sie nicht hingehören...
Viele Grüße,
Simon
Es liegt definitv nicht an den Datentyp des Sockets: Das war ein
Tippfehler von mir hier beim posten.(int statt char :siehe oben)
noch mal:
Die API-Funktion Get_Socket() erwartet als parameter einen
Funktionszeiger listner:
bool Get_Socket(int type, int(*listner)(int socket));
Ich möchte diese API-Funktion nicht direkt aufrufen sondern durch meine
selbsterstellte übergeordnete Funktion aufrufen.
bool My_Get_Sockt(int type, int (*listner)(int socket))
{
return Get_Socket(type,(*listner)(socket));
}
Hakan schrieb:> Es liegt definitv nicht an den Datentyp des Sockets: Das war ein> Tippfehler von mir hier beim posten.(int statt char :siehe oben)>> noch mal:>> Die API-Funktion Get_Socket() erwartet als parameter einen> Funktionszeiger listner:>> bool Get_Socket(int type, int(*listner)(int socket));>> Ich möchte diese API-Funktion nicht direkt aufrufen sondern durch meine> selbsterstellte übergeordnete Funktion aufrufen.>> bool My_Get_Sockt(int type, int (*listner)(int socket))> {> return Get_Socket(type,(*listner)(socket));> }
Grrrrrr
return Get_Socket(type, listner);
A. K. schrieb:> Gibs auf. Gegen diese Sturheit kommst du nicht an. ;-)
Wenn er nicht sooooo stur wäre.
Er tauscht das aus, kriegt eine neue Fehlermeldung und denkt sich:
Hops, das kann es dann wohl nicht gewesen sein, alles retour.
Das die Korrektur des einen Fehlers den nächsten Fehler zum Vorschein
bringt, dürfte ihm noch nicht gedämmert haben.
Es klemmt beim Aufruf des Funktionszeiger bei func3.
[C++ Fehler] Unit1.c(28): E2121 ) fehlt beim Funktionsaufruf
Hat jemand eine Lösung?
Danke
Hakan
#include <conio.h>
#include <stdio.h>
int (*listener)(int a,int b);
int func1(int a,int b);
int func2(int a,int b);
int func3( int c,int (*fx)(int a,int b));
int main(int argc, char* argv[])
{
listener = func1;
printf("listener = func1 Ergenbis=%d\n",(*listener)(2,3));
listener = func2;
printf("listener = func2 Ergenbis=%d\n",(*listener)(3,1));
printf("func3 Ergenbis=%d\n",func3(10,listener);
//!!!!!!!!!!!!!!!!!! hier klemmt's bei func3(10,listener)
getche();
return 0;
}
int func1(int a,int b)
{
return a+b;
}
int func2(int a,int b)
{
return a-b;
}
int func3( int c,int (*f1)(int a,int b))
{
return (*f1)(c,c);
}
Hakan schrieb:> printf("func3 Ergenbis=%d\n",func3(10,listener);> //!!!!!!!!!!!!!!!!!! hier klemmt's bei func3(10,listener)
Und was da klemmt ist exakt das, was in der Fehlermeldung steht:
> ) fehlt beim Funktionsaufruf
Zähl doch mal die Klammern!
printf("func3 Ergenbis=%d\n",func3(10,listener);
^
| hier geht eine Klammer auf
printf("func3 Ergenbis=%d\n",func3(10,listener);
^
| hier geht noch eine Klammer auf
printf("func3 Ergenbis=%d\n",func3(10,listener);
^
| 1 Klammer zu
2 Klammern auf, 1 Klammer zu.
Na, klingelts?