Und noch mal ein paar lib Fragen.. ;)



  • Hi,

    Ich habe mich für das errorhandling einer lib (+log) jetzt für eine callback Funktion entschieden. Dazu hätte ich noch ein paar Fragen.
    Vll kleine Zusatzinfo: Die lib hat nur eine Funktion als echte "Schnittstelle" - danach läuft erstmal ein etwas längerer Prozess.

    1. Die callback Funktion sieht in etwa so aus:

    callback(int type, int code, const char *msg)
    

    Wobei type für den Nachrichtentyp steht (error/info/http-log/etc.)
    - code für die jeweilige Info / den Fehler etc.
    - msg muss nicht immer übergeben werden aber bei manchen Fehlern macht es eben Sinn einen string übergeben zu können. (String wurde nicht gefunden - welcher?^^)

    Frage: Ist das so angenehm? Wenn nicht wie kann man das besser machen?

    2. Jedes Programm welches eventuell mal diese lib nutzen könnnte braucht so eine callback Funktion. Nur wie macht man das jetzt am elegantesten:

    2.1. Callback Funktion wird in der lib deklariert, aber nicht definiert. Vorteil: Ohne Callback compiliert da nix - muss also auch nicht überprüfen ob es eine callback Funktion gibt.

    2.2 Es wird nur ein Pointer auf eine callback Funktion deklariert der dann zugewiesen werden muss. Vorteil: man kann seine Funktion nachher nennen wie man möchte. Nachteil: Ich muss immer überprüfen ob der Zeiger gültig ist.

    2.2.1: Zeiger ist static - und kann über eine Funktion wie "set_callback" gesetzt werden. Vorteil: Eleganter 😕



  • Baue deine einzig existierende Lib-Funktion so aus, dass die mehrere Aufgaben mit unterschiedlichen Parametern übernehmen kann und definiere dann eine Aufgabe für die Registrierung deiner Callback-Funktion:

    /* Lib.h == Client.h */
    typedef void *(*Cb)(int,int,const char*);
    typedef enum{Aufgabe1,Aufgabe2,Registrierung} Aufgabe;
    
    /* Lib.c */
    void *dispatch(Aufgabe aufgabe,void *p){
    switch(aufgabe) {
    static Cb privatecb;
    case Aufgabe1:puts("Aufgabe1");break;
    case Aufgabe2:if(privatecb) privatecb(1,2,"Aufgabe2");break;
    case Registrierung: privatecb=p; break;
    }return 0;}
    
    /* Client.c */
    void *blafasel(int i,int j,const char*s)
    {
      printf("%d %d %s",i,j,s);
      return 0;
    }
    
    int main(){
      dispatch(Aufgabe1,0);
      dispatch(Aufgabe2,0);
      dispatch(Registrierung,blafasel);
      dispatch(Aufgabe2,0);
      return 0;
    }
    


  • Warum gibt da denn eine void Funktion etwas zurück? :p Ups..

    Naja - zum Thema:
    eigentlich hat die lib nur eine Aufgabe. Macht es da nicht mehr Sinn zwei Funktionen zu nehmen?

    /* bla.h */
    bla_register_callback(int (*callback)(int,int,char*));
    bla_task(..);
    

    Wobei das dann Variante 2.1 darstellen würde.. ist das so am elegantesten?



  • cooky451 schrieb:

    Warum gibt da denn eine void Funktion etwas zurück? :p

    blafasel ist keine void-Funktion sondern eine void* Funktion, d.h. sie liefert einen nicht typisierten Zeiger zurück.



  • supertux schrieb:

    cooky451 schrieb:

    Warum gibt da denn eine void Funktion etwas zurück? :p

    blafasel ist keine void-Funktion sondern eine void* Funktion, d.h. sie liefert einen nicht typisierten Zeiger zurück.

    Total übersehen - hat aber ja wenig mit der Fragestellung zu tun 😃


Anmelden zum Antworten