Funktion ueber einen Zeiger aufrufen
-
Hallo Zusammen,
ich habe das Problem die Adresse einer Funktion in einer Uebergabeliste weiterzugeben. Die Übergabeliste wird folgendermassen erwartet
xdrrec_create (u_int, u_int, char , int ()(), int (*)());Die Funktion, die uebergeben werden soll ist wie folgt deklariert
int TCPSENDEN(void *vWert, char *cWert, int iWert);
int(__closure *TCPsend)(void*, char*, int);Der Code zu der Funktion ist
int TChatForm::TCPSENDEN(void* handle, char* sendbuffer, int sbsize)
{
// Code
}Die Adresse wird zugewiesen mit
ChatForm->TCPsend = ChatForm->TCPSENDEN;Der Aufruf ist
xdrs = xdrrec_create(100,100,KompName,NULL, TCPsend(vi, &ci, iGroesse));Die erhaltenen Fehlermeldungen sind
[C++ Fehler] main.cpp(346): E2034 Konvertierung von 'int' nach 'int ()()' nicht möglich
[C++ Fehler] main.cpp(346): E2340 Keine Übereinstimmung des Typs beim Parameter 5 ('int ()()' erwartet, 'int' erhalten)Die FAQs haben mir auch nicht weiter helfen können. Was mache ich falsch?
Danke für Eure Hilfe
Evi48
-
auf ersten blick sehe ich, dass mit
xdrrec_create(100,100,KompName,NULL, TCPsend(vi, &ci, iGroesse));
wird keine adresse sondren das ergebnis der TCPsend() methode übergeben. und das ist von typ int.
-
Hallo Xqgene,
der Zweck der Funktionsadresse ist, dass aus der Funtion
xdrrec_create (u_int, u_int, char , int ()(), int (*)());über die Adresse eine Funktion zum Senden oder Empfangen von einem TCP-Record aufgerufen werden kann. So ist der Parameter 4 zum Lesen und der Parameter 5 zum Schreiben. Im Manual sind die Funktionen so beschrieben:
int (*readit)( void *readhandle, char *buf, int len);
int (*TCPsend)( void *writehandle, char *buf, int len);Diese Funktionen werden in Abhängigkeit der Verwendeten Tools für TCP mit Leben gfüllt.
Die Deklarationen von readit und TCPsend verstehe ich so, dass die Funktionen jeweils einen Int-Wert als Funktionsergebnis liefern. Ich habe auch bereits die Version versucht kein Funktionsergebnis in der Deklaration von
void (*TCPsend)( void *writehandle, char buf, int len);
zuzulassen dann bekomme ich die Fehlermeldung
[C++ Fehler] main.cpp(346): E2468 Ein Wert vom Typ void ist nicht zulässig.
[C++ Fehler] main.cpp(346): E2340 Keine Übereinstimmung des Typs beim Parameter 5 ('int ()()' erwartet, 'void' erhalten)Rufe ich die Funktion
TCPsend(vi, &ci, iGroesse);in einer gtrennten Zeil auf funktioniert das einwandfrei.
Ich habe keine Ideen mehr was da zu tun sein koennte sein koennte. Faellt dir noch was ein oder weiss einen Weg, wo ich suchen kann.
Danke
Evi48
-
der fehler ist nicht im aufruf von TCPsend() sondern im aufruf von xdrrec_create(). xdrrec_create erwartet an 5 stelle ein "wert" von typ int*, TCPsend() gibt aber als ergebnis int zurück. und wenn parameter 5 eine adrese der funktion erwartet dann sollst du ach die adresse der funktion übergeben und nicht deren ergebnis.
ungefähr so:
xdrrec_create(100,100,KompName,NULL, TCPsend);
-
Hallo Xqgene,
bei der Deklaration
int* TCPSENDEN(void *vWert, char *cWert, int iWert);
int*(__closure *TCPsend)(void*, char*, int);bekomme ich die Fehlermeldungen
[C++ Fehler] main.cpp(346): E2034 Konvertierung von 'int ' nach 'int ()()' nicht möglich
[C++ Fehler] main.cpp(346): E2340 Keine Übereinstimmung des Typs beim Parameter 5 ('int (*)()' erwartet, 'int *' erhalten)Verwende ich den Aufruf
xdrrec_create(100,100,KompName,NULL, TCPsend);wie es eigentlich logisch wäre bekomme ich die Fehlermeldungen
[C++ Fehler] main.cpp(346): E2034 Konvertierung von 'int (* (_closure )(void *,char ,int))(void ,char ,int)' nach 'int ()()' nicht möglich
[C++ Fehler] main.cpp(346): E2340 Keine Übereinstimmung des Typs beim Parameter 5 ('int ()()' erwartet, 'int ( (_closure )(void *,char *,int))(void *,char *,int)' erhalten)Diese Versionen hatte ich bereits getestet und bin auch jetzt leider zu keinem Ergebnis gekommen. Ich bin wirklich recht ratlos.
Danke
Evi48
-
ist TCPsend() eine klassenmethode?
versuch mal sie nicht als klassenmethode zu deklarieren:
int TCPsend(void* H, char* M, int I)
{
}und dann aufrufen mit
xdrrec_create(100, 100, "NONAME", NULL, (int (*)())TCPsend);
Was ist das überhaupt für'n zeug, was du da machst? woher hast du xdrrec_create()?
-
[DOPELPOST]
-
Hallo Xqgene,
es geht dabei um die Netzwerkuebertragung von Daten zwischen zwei Rechnern mittels XDR. Die Funktion xdrrec_create erzeugt aus Daten einen XDR-Stream der mit der Funktion TCPsend uebertragen wird. XDR ist eine Rechner und Betriebssystem unabhängige Datenstruktur. Die Funktion xdrrec_create ist Bestandteil eines gekauften Toolkit. Eine Anfrage beim Lieferanten ist bisher Ergebnislos verlaufen also versuche ich auf diesem Wege ein Lösung des Problems zu erreichen.Dein Vorschlag war für eine fehlerfreie Übersetzung schon sehr gut doch leider wird die Funktion TCPsend dann nicht aufgerufen.
Das Problem hat sich verlagert.
Danke
Evi48
-
Hallo Xqgene,
vielen Dank für deine Hilfe. Es ist schon so ein Problem wenn man mit Zeigern auf Funktionen Neuland betritt und zusätzlich in den gekauften Tools noch Fehler in der Deklaration der verwendeten Funktionen sind. Nachdem die Fehler behoben waren konnte auch die Funktion übersetzt und aufgerufen werden.Evi48