Für C Profis: Funktionszeiger

Gast #2247104
Lesenswert?

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.
#2247131
Lesenswert?

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:
5
typedef int (*LstnFnct) ( int Socket );
6

7
bool My_Get_Sockt( int type, LstnFnct listner )
8
{
9
  return Get_Socket( type, listner );
10
}
#2247153
Lesenswert?

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.
Gast #2247171
Lesenswert?

@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.
#2247174
Lesenswert?

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.
Gast #2247179
Lesenswert?

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));
}
#2247182
Lesenswert?

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);
#2247217
Lesenswert?

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.
Gast #2247514
Lesenswert?

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);
}
#2247542
Lesenswert?

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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren