Mal wieder Frage :D Zeiger



  • Hallo...

    1. Kann mir jemand nochmal die Definition/Nutzung von Funktionspointer in VC++ erklären? Ich habe mehrere Workshops angesehen, deren Codes jedoch nicht mit MS VC++ ausführbar waren. o_O
    Und wie erstelle ich einen Array mit F. Pointer?

    2. Stimmt es, dass ich void-Pointer als universelle Pointer einsetzen kann? Also zum Beispiel in Funktionsparameter später bei Aufruf beliebige Typenpointer einsetzen kann. Das habe ich in einem Workshop gelesen.

    Danke schonmal 😃



  • ich schubs dich mal in die VC++ sektion wenns mit dem Probleme gibt 😉



  • denial schrieb:

    1. Kann mir jemand nochmal die Definition/Nutzung von Funktionspointer in VC++ erklären? Und wie erstelle ich einen Array mit F. Pointer?

    Zu Funktionszeigern: C++ Forum -> Suche/FAQ.
    Um die Dinger in ein Array zu packen, bietet es sich an ein typedef zu setzen. Dann kannst einfach "FunktionsZeiger array[100];" schreiben.

    denial schrieb:

    2. Stimmt es, dass ich void-Pointer als universelle Pointer einsetzen kann?

    Wenn du C programmieren würdest, ja.
    Unter C++ benutzt man templates, wenn man es universell braucht. Wenn es nur um Pointer geht und nicht gar so generisch wie templates sein soll oder kann: Klassen, die alle von einer gemeinsamen Basisklasse erben. Übergeben werden dann Basisklassenpointer.
    Auch hier: C++ Forum -> Suche/FAQ (Stichwort Polymorphie).



  • Zu 2.

    Pointer sehen Programmtechnisch alle gleich aus. Das ist einfach eine 32-Bit-Zahl die an eine Stelle im Speicher zeigt.

    Das bennen von Pointern dient lediglich deinem Compiler das er dich auf Fehler hinweisen kann.
    Auch ein Typcast zwischen Pointern sollte IMHO im generierten Code an dieser Stelle nichts ändern.



  • So, ich komm doch nich drum rum, nochmal nachzufragen, sorry.
    Ich wollt den Pointer jetzt im Programm einbauen, ich bekomm aber 4 Fehlermeldungen vom Compiler zurück. Folgender recht unsinniger Code war natürlich ein Test. Trotzdem sollte er laufen.

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


  • Hi !

    Welche Fehlermeldungen denn ??



  • Ich vermute mal, Du wolltest es als Windows-Programm kompilieren, wegen des
    Message-Box-Aufrufs.
    Dann ist es einfach nur ein Deklarationsfehler, schätze ich jetzt einfach mal ganz grob, denn wenn man es für ne Konsolenanwendung umschreibt, dann funzt das nämlich supi dupi.

    [cpp]
    #include <iostream.h>

    int f_msgbox1(void*,void*)
    {
    cout << "Test 1" << endl;
    return 1;
    }

    int f_msgbox2(void*,void*)
    {
    cout << "Test 2" << endl;
    return 1;
    }

    int f_msgbox3(void*,void*)
    {
    cout << "Test 3" << endl;
    return 1;
    }
    int (*ptFunc[3]) (void*,void*);

    void main(int argc, char* argv[])
    {
    ptFunc[0] = f_msgbox1;
    ptFunc[1] = f_msgbox2;
    ptFunc[2] = f_msgbox3;

    ptFunc[0](NULL, NULL);
    ptFunc[1](NULL, NULL);
    ptFunc[2](NULL, NULL);
    }
    😉



  • :\Programme\Microsoft Visual Studio\MyProjects\rtx\main.cpp(63) : error C2466: Reservierung eines Feldes der konstanten Groesse 0 nicht moeglich
    C:\Programme\Microsoft Visual Studio\MyProjects\rtx\main.cpp(63) : error C2501: 'ptFunc' : Fehlende Speicherklasse oder Typbezeichner
    C:\Programme\Microsoft Visual Studio\MyProjects\rtx\main.cpp(63) : error C2373: 'ptFunc' : Neudefinition; unterschiedliche Modifizierer
            C:\Programme\Microsoft Visual Studio\MyProjects\rtx\main.cpp(62) : Siehe Deklaration von 'ptFunc'
    C:\Programme\Microsoft Visual Studio\MyProjects\rtx\main.cpp(63) : error C2440: 'initializing' : '' kann nicht in 'int []' konvertiert werden
            Es gibt keine Konvertierungen von Feldtypen, obwohl es Konvertierungen von Verweisen oder Zeigern in Felder gibt
    Fehler beim Ausführen von cl.exe.
    


  • Will aber mit Windows arbeiten 😞



  • 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


Anmelden zum Antworten