Function Pointer - Argumente reduzieren



  • Momentan versuch ich das da:

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct {
    	void (*add)(int);
    	int value;
    }Test;
    
    void addF(Test *s, int j){
    	s->value += j;
    	return;
    }
    
    Test *newTest(){
    	Test *t = malloc(sizeof(Test));
    	t->value = 0;
    	t->add = &addF(t, int);
    
    	return t;
    }
    
    int main(int argc, char **argv){
    	Test *t = newTest();
    	t->add(1291);
    
    	printf("%d", t->value);
    
    	return 0;
    }
    

    Und da krieg ich (was ich zugegebenermassen auch vermutet hab) ein

    test.c:17:17: Fehler: expected expression before »Test«
    test.c:17:17: Fehler: Zu wenige Argumente für Funktion »addF«
    

    Geht überhaupt, was ich da versuch?



  • Nöö. Nur mit Makros und zwar mit einem Makro pro Objekt, also sehr statisch:

    #include <stdio.h>
    #include <stdlib.h>
    
    struct Test;
    struct Test {
            int i;
            void (*add) (struct Test*, int);
    };
    typedef struct Test Test;
    
    void add(Test* t, int i) { printf("%d\n", i); }
    
    int main() {
            Test* t = malloc(sizeof(Test));
            t->add = add;
            #define t_add(i) t->add(t, i)
            t_add(128);
    }
    

    Da wäre es von der Lesbarkeit her IMO besser, die add(Test*, int)-Funktion direkt zu benutzen. In C++ geht das übrigens wunderbar, Stichworte function object und bind1st. Wobei man das hier nicht brauchen würde.



  • Da versucht jemand C++ nachzubauen. Nein, geht nicht, der this-Zeiger ist bei Methoden C++ implizit, in C muss er explizit sein. D.h. er muss auch bei Methoden explizit uebergeben werden.


Anmelden zum Antworten