Mal wieder Frage :D Zeiger



  • Hast Du denn die Funktion auch C++ Style like deklariert ?



  • hhmmmm..als Konsolenproggie läuft es, aber als Windowsprog. bekomme ich eine Fehlermeldung:
    ompilierung läuft...
    StreamDlg.cpp
    C:\Stream\StreamDlg.cpp(224) : error C2440: '=' : 'int (__thiscall CStreamDlg::*)(void *,void *)' kann nicht in 'int (__cdecl *)(void *,void *)' konvertiert werden
    Es gibt keinen Kontext, in dem diese Konvertierung moeglich ist
    Generieren von Code...
    Kompilieren...
    Stream.cpp
    Generieren von Code...
    Fehler beim Ausführen von cl.exe.

    Stream.exe - 1 Fehler, 0 Warnung(en)

    kann ich im Moment gar nix mit anfangen 😞



  • Was bedeutet für dich "C++ style-like"?
    Oben ist ja die Funktion. Wenn du Klassen meinst, so habe ich nicht vor, mit Klassen zu arbeiten, wenn diese nicht dringend notwendig wären. Ich will einfach nur meinen Funktionszeiger zum Laufen bekommen.



  • Ja, genau das habe ich gemeint



  • Ich kann mir aber beim besten Willen nich vorstellen, dass es einfache Funktionszeiger nur in Konsolenanwendungen gibt 😉 Wer kann helfen?



  • Das kann ich mir genausowenig vorstellen, weiss aber im Moment leider keinen Rat.



  • Jepp !! Es geht, was beide Versionen betriff. C++ like und auch im C Stil
    im C Stil kann man die Funktionsdefinition in eine Headerdatei auslagern.

    Wenn man nen Zeiger auf ne Elementfunktion richtet, dann wird die Syntax schon ein wenig ungewohnt, wie ich finde.

    Aber erstmal im C Stil, ausgelagerte Headerdatei:

    // Global.h

    [code]
    bool GlobalCplusplusFlegelStyle (void*, void*) // Funktiosdefinition
    {
    	AfxMessageBox("Hi there!");
    	return (1+1 != 2);
    }
    

    [/code]
    Dann, irgendwo in deinem Proggie:

    #include Global.h

    .....

    [code]
    bool (*ptFunc)(void*, void*); // Zeiger auf Funktion mit Rückgabtyb bool deklarieren
    
    ptFunc =  GlobalCplusplusFlegelStyle; // Zeiger auf Funktion richten
    bool b = ptFunc(NULL, NULL);  // Funktionsaufruf
    

    [/code]
    ..........
    // funzt

    ***************************************************

    Jetzt in C++ :

    /*
    Deklariert in StreamDlg.h:
    .....

    [code]
    public: int MsgBox(void*, void*);  // Deklaration der Memberfunktion
    private : int (CStreamDlg::*ptFunc) (void*, void*); // Deklaration des Zeigers auf Member-Funktion mit Rückgabetyp int
    

    [/code]
    .....
    */

    /*
    Definiert in StreamDlg.cpp:
    .......

    [code]
    int CStreamDlg::MsgBox(void *, void *)
    {
        AfxMessageBox("Geht doch ;-)");
        return 1;
    }
    

    [/code]
    .....
    */

    // Jetzt noch der Code um die Fkt aufzurufen
    ......

    [code]
     CStreamDlg dlg; // Ermöglicht Zugriff auf privaten Zeiger auf Funktion
     ptFunc = CStreamDlg::MsgBox;  // Zeiger auf Member-Funktion richten
     (dlg.*ptFunc)(NULL, NULL);   // Funktion aufrufen
    
    .......       // funzt
    

    [/code]
    Jooo, jetzt kann man auch, wenn man lustig ist, für beide Versionen mehrere Funktionen schreiben und diese dann in ein Array packen ,oder was auch immer.

    So, jetzt hab ich mir nen Kaffee verdient *sichmalaufdieschulterklopft*, prost !!



  • Also entweder bin ich komplett beschränkt, oder es stimmt etwas nicht. Ich hatte die Funktion sowieso schon in einem Header ausgelagert, ich habs jetzt nochmal genauso gemacht, wie du es gesagt hast. Header mit Funktion, Header includet, Pointer definiert und zugewiesen. Immernoch die verdammten Fehler. Linkst du noch irgendeine Lib oder Standard-Include hinzu, damit das unterstützt wird? Ich komm kein Deut weiter. 😞

    Naja danke, ich probiers jetz mal mit der Klassen/C++ Variante 🙄



  • Nö, keine weiteren includes



  • Der Code zum Beispiel funktioniert jetz:

    typedef int (*ptFunc) (void*,void*);
    ptFunc func = globalmsgbox;
    

    Der allerdings nicht:

    typedef int (*ptFunc) (void*,void*);
    ptFunc func;
    func = globalmsgbox;
    

    Verrückt oder? Man müsste doch davon ausgehen, dass beide Varianten funktionieren. Leider bin ich auf die zweite angewiesen, da ich einen Funktionszeiger-Array bräuchte. Gibt es einen Profi der helfen kann?



  • Bei Deinem letzten Posting, beiden Codebeispiele, da sehe ich keinen Unterschied.
    Was willst Du eigentlich mit dem typedef davor ?? *grübel*
    Profi...keine Ahnung, kenne ich keinen, ausser das eine oder andere Nachschlagewerk;

    Guckst Du hier:
    http://www2.pmf.fh-goettingen.de/~awolf2/mfc/ressourcen/c++21/data/kap14.htm#776713



  • ps, keinen funktionellen Unterschied *g*



  • Besides, was willstn mit nem Profi, wenns bei mir läuft, dann sollte es doch wohl auch auf nem anderen Rechner zum Laufen zu kriegen sollen tun sein oder net.



  • Was heißt Profi, jemand ders halt kapiert 😃
    Danke für den Text, ich les es morgen durch, heut nacht wird das nix mehr mit dem Kopf 😉

    Ja die beiden obigen Beispiele machen keinen sinnvollen Unterschied, ich war nur fasziniert, dass der eine geht, der andere nicht. Das typedef brauch ich, um aus dem Pointer anschließend einen Array zu machen.



  • Hm, hattest doch schon ein Array gemacht, ohne typedef, bei Deinem ersten Beispiel:

    ....
    int f_msgbox(void*,void*) 
    { 
        MessageBox(NULL,"test","test",MB_OK); 
        return(1); 
    } 
    ..... 
    
    int (*ptFunc[5]) (void*,void*); 
    ptFunc[0] = f_msgbox;
    

    Das muss halt nur anders eingebunden, inkludiert werden, dann läuft das doch eins a.
    Ich geh mal bubu machen, bis danni.



  • Oky! Endlich funktionierts!
    Danke dir für die Hilfe.


Anmelden zum Antworten