pit030771 Geschrieben 12. April 2006 Teilen Geschrieben 12. April 2006 :confused: Hi, habe da ein Prob mit Funtionszeigern, vieleicht kann mir jemand helfen! Arbeite grade das Buch "Die C++ Programmiersprache" durch. Bin an dem Kapitel Zeiger auf Funktionen angelangt. So die Übung lautet wie folgt ... "Schreiben Sie Deklarationen für das folgendende: eine Funktion, die Argument vom char* und int& hat und keinen Wert zurückgibt; einen Zeiger auf solche Funktion; eine Funktion die einen solchen Zeiger als Argument erhält; eine Funktion die einen solchen Zeiger zurückgibt. Schreiben Sie eine Definition einer Funktion, die einen solchen Zeiger als Argument und ihr Argument als Rückgabewert liefert. TIPP: Benutzen Sie typedef." Habe auch schon rumexperimentiert, aber komm nicht weiter ... #include "..\std_include.h" void f1(char*, int&); void (*zf1) (char*, int&); typedef void (*fzeiger)(char*, int&) ; fzeiger fnk1(char*, int&); fzeiger (*z)(char*, int&); void* (zeig) (void* a); typedef void ( *zeig2) (void*); zeig2 zeige(zeig2); void main() { int d=9; z= &fnk1; //geht zf1 =&f1; // geht auch zf1("Hallo", d); d++; fnk1("hallo", d); d++; z("hallo2", d); cout <<zeig(*zf1)<<" *zf1"<<endl; // funzt auch cout <<zeig(*z) <<" *z "<<endl<<endl; // funzt auch cout <<zeige(*zeig); // aber da gibt probs mit der konvertierung cin.get(); } fzeiger fnk1(char* a, int& { cout <<a<<" "<<b<<endl; return 0; } void* zeig(void* a) { cout <<a<<endl; return a; } void f1(char* a, int& { cout <<a<<" f1 "<<b<<endl; } zeig2 zeige(zeig2 a) { cout<<a<<endl; return a; } Wäre sehr nett wenn Ihr mir helfen könntet. Gruß Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
pit030771 Geschrieben 13. April 2006 Autor Teilen Geschrieben 13. April 2006 Danke!!! :-( Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 13. April 2006 Teilen Geschrieben 13. April 2006 Danke!!! :-( Wofür? Dafür, dass niemand Lust hatte, in deinem Code, der nicht eingerückt ist, weil du keine Code-Tags benutzt hast, den Fehler zu suchen? Dafür, dass niemand versucht hat, ohne irgendeine Fehlerbeschreibung von dir sich den Code genauer anzusehen? Übrigens: "komm nicht weiter" und "probs mit der konvertierung" sind keine brauchbare Fehlerbeschreibung. Dafür, dass niemand raten wollte, ob du eine Frage hast und wie sie lauten könnte? Gestellt hast du nämlich keine. Dass du bisher keine Antworten bekommen hast, liegt hauptsächlich an dir. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
pit030771 Geschrieben 13. April 2006 Autor Teilen Geschrieben 13. April 2006 Dann noch mal von vorn.... #include "..\std_include.h" void f1(char*, int&); void (*zf1) (char*, int&); typedef void (*fzeiger)(char*, int&) ; fzeiger fnk1(char*, int&); fzeiger (*z)(char*, int&); void* (zeig) (void* a); typedef void ( *zeig2) (void*); zeig2 zeige(zeig2); void main() { int d=9; z= &fnk1; zf1 =&f1; zf1("Hallo", d); d++; fnk1("hallo", d); d++; z("hallo2", d); cout <<zeig(*zf1)<<" *zf1"<<endl; cout <<zeig(*z) <<" *z "<<endl<<endl; cout <<zeige(*zeig); // diese Zeile macht probleme unten mehr cin.get(); } fzeiger fnk1(char* a, int& { cout <<a<<" "<<b<<endl; return 0; } void* zeig(void* a) { cout <<a<<endl; return a; } void f1(char* a, int& { cout <<a<<" f1 "<<b<<endl; } zeig2 zeige(zeig2 a) { cout<<a<<endl; return a; } [/code] ** Da schmeist der Compiler die Fehlermeldung raus: error C2664: 'zeige': Konvertierung des Parameters 1 von 'void *(void *)' in 'zeig2' nicht möglich Diese Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat was bedeutet das und warum ist das so? Verstehe das nicht! zeig2 ist doch auch als void* definiert, oder hab ich das mit typedef falsch verstanden?? Ich hoffe das ist jetzt ausreichender! Sry. Gruß p Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 13. April 2006 Teilen Geschrieben 13. April 2006 zeig2 ist definiert als Funktion mit dem Rückgabetyp void. zeig ist eine Funktion, die void* zurückgibt. Das passt nicht. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
pit030771 Geschrieben 13. April 2006 Autor Teilen Geschrieben 13. April 2006 Das gibts doch nicht, das lag nur an dem doofen Stern!?!?!? Mann mann, danke! Kann man so eine Funktion auch so def, dass ich jede Art von funktion als zeiger übergeben kann. Oder müssen die über und Rückgabetypen übereinstimmen? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Guybrush Threepwood Geschrieben 13. April 2006 Teilen Geschrieben 13. April 2006 Ja aber du solltest dich glaube ich erst nochmal mit dem "doofen Stern" beschäftigen und was er bedeutet...und wo der unterschied zwischen void und void* ist. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 13. April 2006 Teilen Geschrieben 13. April 2006 Kann man so eine Funktion auch so def, dass ich jede Art von funktion als zeiger übergeben kann. Oder müssen die über und Rückgabetypen übereinstimmen?Die müssen genau übereinstimmen. Es gibt bei Funktionszeigern keine automatischen Konvertierungen. Bei C++ kommt bei bei Memberfunktionszeigern noch der Typ der Klasse hinzu, außer bei statischen Memberfunktionen. Etliche Compiler unterscheiden auch noch nach Aufrufkonvention. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Guybrush Threepwood Geschrieben 13. April 2006 Teilen Geschrieben 13. April 2006 Die müssen genau übereinstimmen. Sicher? GetProcAddress zum Beispiel kann ja auch Funktionszeiger mit beliebigen Rückgabewerten und Parametern zurück geben. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 14. April 2006 Teilen Geschrieben 14. April 2006 GetProcAddress zum Beispiel kann ja auch Funktionszeiger mit beliebigen Rückgabewerten und Parametern zurück geben.Nein, GetProcAddress gibt dir immer einen Funktionszeiger vom Typ FARPROC zurück, das ist eine Funktion, die keine Parameter hat und int zurückgibt. Weil das in den wenigsten Fällen stimmt, und weil es eben bei Funktionszeigern keine impliziten Konvertierungen gibt, musst du den Rückgabewert ja meistens mit einem Cast explizit umwandeln. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Guybrush Threepwood Geschrieben 14. April 2006 Teilen Geschrieben 14. April 2006 Stimmt. Aber genau auf diesem Weg kann man doch auch Funktionen schreiben die einen beliebigen Funktionspointer akzeptieren. Mann muss sich lediglich einen Weg überlegen wie man in der Funktion erkennt in welchen Funktionstyp man den Pointer casten muss. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 15. April 2006 Teilen Geschrieben 15. April 2006 Der Compiler tut das, wenn man C++-Funktionen aus DLLs exportiert. Die Name Decoration, mit der die Aufrufkonvention und die Rückgabe- und Parametertypen in den Namen integriert werden, dient allerdings nur dazu, auch bei DLL-Importen Überladung anbieten zu können. Ein generischer Mechanismus ist das eigentlich nicht. C++-Funktionen importiert man ja üblicherweise auch nicht mit GetProcAddress. Wenn man so etwas selbst machen will, muss man die Typinformationen irgendwie anders transportieren, denn Namen hat man zur Laufzeit nicht, und dynamic_cast gibt's bei Funktionszeigern auch nicht. Das riecht nach schlechtem Design. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Guybrush Threepwood Geschrieben 15. April 2006 Teilen Geschrieben 15. April 2006 Das riecht nach schlechtem Design. Da gebe ich dir recht, ich wollte auch nur darauf raus das es prinzipiell möglich ist Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
pit030771 Geschrieben 15. April 2006 Autor Teilen Geschrieben 15. April 2006 ich danke euch für eure antworten. wollte auch jetzt nicht so eine diskussion anfachen, die für mich so wie so noch zu weit führen würde. bin doch noch ganz am anfang mit c++. aber hat nicht jeder mal klein angefangen. ich finde es recht schwierig sich diese programmiersprache autodidaktisch, nur mit büchern, beizubringen. deshalb finde ich so was hier nicht ganz passend... Ja aber du solltest dich glaube ich erst nochmal mit dem "doofen Stern" beschäftigen und was er bedeutet...und wo der unterschied zwischen void und void* ist. ... ich bin da für jede hilfe dankbar. ich ddenke aber schon, dass ich weiß wofür diese worte stehen. vieleicht hab ich das auch falsch verstanden, berichtigt mich wenns nicht stimmt. void --> funktion ohne rückgabe void* --> zeiger auf einen typ oder funktion ich finde es ziemlich schwierig das alles aus büchern nach zu vollziehen, vor allem wenn man so übungen aus einem buch machen soll, woraus man bis dato keinen praktischen nutzen sieht. gruß pit Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Bubble Geschrieben 15. April 2006 Teilen Geschrieben 15. April 2006 ich finde es ziemlich schwierig das alles aus büchern nach zu vollziehen, vor allem wenn man so übungen aus einem buch machen soll, woraus man bis dato keinen praktischen nutzen sieht. Wenn Dir Bücher alleine zu trocken sind (was nichts negatives ist), dann brauchst Du zusätzlich eine andere Art der aktiveren Fortbildung (Schulung, Unterricht) und Übungsaufgaben, die Du selbst bearbeitest und zu denen Du Fragen stellen kannst. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
pit030771 Geschrieben 15. April 2006 Autor Teilen Geschrieben 15. April 2006 ja, da hast du schon recht. das problem ist nur das solche sachen sehr teuer sind. aber ich glaube so eine diskussion gehört hier auch nicht hin. darüber könnte per pm schreiben. wenn du da tips für mich hast meil mich an. pit Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.