Funktionszeiger mit Platzhalter (null)



  • Hallo,

    ich versuche mich gerade an Funktionszeigern und habe ein kleines Problem, folgendes Beispiel:

    void (*funcptr[])()={funktion1,funktion2,NULL};
    

    Die Funktionen 1 bis 2 kann ich problemlos aufrufen, nur wie kann ich einen Platzhalter für Funktion 3 erstellen? Beim Aufruf soll dann schlichtweg gar nichts passieren.

    Natürlich habe ich schon gesucht und nachdem was ich so gelesen habe, darf man Funktionszeiger gleich Null setzen - nur aufrufen darf man sie dann scheinbar nicht.

    Zwar könnte man den Index 2 abfangen, eine extra Funktion dafür implementieren etc., nur würde mich interessieren, ob es einen anderen (besseren) Weg gibt?

    Grüße



  • Das letzte Element von Arrays ist stillschweigend immer null (wenn dessen Länge nicht bekannt ist).
    Du kannst dann so etwas machen:

    void (*fnc)();
    for (fnc = fncptr; *fnc; ++fnc)
        fnc();
    

    => Die 0 markiert das Ende der Liste (strings und argv machen das auch so).



  • Hm, ok, ich meinte das etwas anders... Da war mein Beispiel wohl etwas unglücklich gewählt, ich hätte es auch so schreiben können:

    void (*funcptr[])()={funktion1,NULL,funktion3};
    

    Null habe ich einfach nur als Platzhalter gewählt - sprich der Funktionsindex soll fehlerfrei aufrufbar sein, aber in der Ausfürung nichts bewirken. So als würde ich (durch Index 1) eine leere Funktion aufrufen.

    Hoffe, dass ich mich einigermaßen verständlich ausgedrückt habe 😕



  • Dann gib doch den Zeiger auf eine leere Funktion an.

    void nullfunc() { return; }
    
    void (*funcptr[])()={funktion1,nullfunc,funktion3};
    


  • Schon klar, dass das geht. Für mich war nur die Frage, ob es auch ohne extra leere Funktion machbar ist. Nunja, scheinbar nicht.

    Danke für die Hilfe! 🙂



  • droasiäm schrieb:

    Das letzte Element von Arrays ist stillschweigend immer null (wenn dessen Länge nicht bekannt ist).

    Ähhh, das halte ich für falsch. Btw. ... kannst Du mir mal ein Beispiel für ein Array geben, dessen Länge nicht bekannt ist?

    An TE:

    Bei mir funktioniert:

    void funktion1();
    void funktion2();
    
    void (*funcptr[])()={funktion1,funktion2, 0};
    

    oder auch:

    void funktion1();
    void funktion2();
    
    void (*funcptr[3])()={funktion1,funktion2};
    


  • Die Deklaration funktioniert (ein Pointer kann Null sein), nur darf man dann keine dieser als Null definierten Funktionen aufrufen.



  • Mhm, dann hatte ich Dein Problem nicht, oder nur halb verstanden. Das, was Du willst, geht aber so nicht. Da mußt Du dann schon auf eine Dummy-Funktion, wie von DirkB vorgeschlagen, zurückgreifen.



  • Dann teste doch einfach auf NULL:

    void (*funcptr[])()= {funktion1, NULL, funktion2};
    
    void CallFunc(int index)
    {
      if(funcptr[index])
         funcptr[index]();
    }
    


  • Auf die einfachste Lösung kommt man mal wieder nicht 😃 Danke, so werde ich es machen 🙂


Anmelden zum Antworten