Funktionspointer



  • Hallo,

    ich möchte gerne eine Funktion filter() schreiben, die jedes Pixel eines Bildes durchläuft und manipuliert. Die Manipulation soll je nach übergebenen Funktionspointer geschehen. Also Beispielsweise lowpass().

    Der Rückgabewert der Funktionen ist immer gleich, aber die Anzahl der übergebenen Parameter schwankt. Ich habe unten mal einen Lösungsansatz gepostet. Meine Frage ist: Wie kann ich das Lösen, das entweder ein oder mehrere Parameter aufgerufen werden können?

    typedef void (*pFunc)(U8 ppix, void *arg);
    
    void filter(..., pFunc call, void *values) {
    
      ...
      *ppix = pFunc(*ppix, values[0]);
    
    }
    
    U8 lowpass(U8 ppix, int thresh) {
      ...
      return res;
    }
    
    U8 bandpass(U8 ppix, int low, int high) {
      ...
      return res;
    }
    

    Grüße Hans



  • Du könntest die Argumente jeweils in eine Struktur packen und einen void-Zeiger darauf mitgeben. Also z.B.

    typedef void (*pFunc)(U8 ppix, void *arg);
    
    void filter(..., pFunc call, void *values) {
    
      ...
      *ppix = pFunc(*ppix, values);
    
    }
    
    struct lowpass_data {
      int thresh;
    };
    
    U8 lowpass_wrapper(U8 ppix, void* data)
    {
      struct lowpass_data* lpdata = data;
      return lowpass(ppix, lpdata->thresh);
    }
    
    U8 lowpass(U8 ppix, int thresh) {
      ...
      return res;
    }
    
    struct bandpass_data {
      int low, high;
    };
    
    U8 bandpass_wrapper(U8 ppix, void* data) {
      struct bandpass_data* bpdata = data;
      return bandpass(ppix, bpdata->low, bpdata->high);
    }
    
    U8 bandpass(U8 ppix, int low, int high) {
      ...
      return res;
    } 
    
    struct bandpass_data data = { 100, 200 };
    filter(..., bandpass_wrapper, &data);
    


  • Schon mal daran gedacht, alle deine Kandidatenfunktionen mit variablen Parameterlisten auszustatten?



  • Du kannst
    - die variable Argumentenliste aus stdarg.h benutzen
    - alle Filterfunktionen mit den gleichen Argumenten definieren.
    - die Parameterliste des Funktionszeigers leer lassen. typedef void (*pFunc)(); (Geht nur in C, nicht in C++)
    - eine Mischung:

    U8 lowpass(U8 ppix, int thresh, ...);
    U8 bandpass(U8 ppix, int low, int high);
    

    Du brauchst die variablen Argumente nicht auswerten.


Anmelden zum Antworten