Problem mit Zeiger auf Funktionen.



  • Ich habe folgende Struktur gemacht:

    struct key_func
    {
    	int (*(Key_down)(unsigned char scan1, unsigned char scan2, unsigned char shift));
    	int (*(Key_press)(unsigned char Ascii));
    	int (*(Key_up)(unsigned char scan1, unsigned char scan2, unsigned char shift));
    	unsigned char Activ;
    }Key_Functionen;
    

    Mit einer Add Funktion will ich jetzt der Struktur Funktionen zuweisen:

    void Add(int Type, void Func())
    {
    	switch (Type)
    	{
    		case 1:   //Key_down
    			Key_Functionen.Key_down = &Func;
    			break;
    		case 2:   //Key_press
    			Key_Functionen.Key_press = &Func;
    			break;
    		case 3:   //Key_up
    			Key_Functionen.Key_up = &Func;
    			break;
    	}
    }
    

    Hier weis ich nicht genau wie das geht.



  • #include <stdio.h>
    #include <stdlib.h>
    #include <stdarg.h>
    #include <stdbool.h>
    
    typedef
    	struct FunctionsPointers {
    		int (*f1) (int);
    		int (*f2) (int, int);
    	} FPTRS;
    
    int myf1(int p1) {
    	printf("myf1: %d\n", p1);
    	return 1;
    }
    
    int myf2(int p1, int p2) {
    	printf("myf2: %d\t%d\n", p1, p2);
    	return 2;
    }
    
    bool add(FPTRS *fptr, unsigned int nr, int (*f) (int, ...) ) {
    	switch(nr) {
    		case 1:
    			fptr->f1 = f;
    			break;
    		case 2:
    			fptr->f2 = f;
                break;
    		default:
    			return false;
    	}
    	return true;
    }
    
    int main(int argc, char **argv) {
    	FPTRS *fptr = malloc(sizeof(FPTRS));
    	add(fptr, 1, myf1);
    	add(fptr, 2, myf2);
    	fptr->f1(10);
    	fptr->f2(100, 1000);
    	exit(EXIT_SUCCESS);
    }
    

    Wirklich optimal ist das aber auch nicht. Der Compiler gibt nämlich Warnungen aus, da die Signatur der übergebenen Funktion mit der Signatur des Arguments f der add-Funktion wegen der Variadic-Angabe nicht wirklich übereinstimmt. Gleiches gilt für die Zuweisung innerhalb der case-Anweisungen.
    Funktionieren tut's allerdings 😃



  • So ich hab das jetzt so gelöst.

    typedef int (*KeyDown_T)(char scan1, char scan2, unsigned char shift);
    typedef int (*KeyPress_T)(char Ascii);
    typedef int (*KeyUp_T)(char scan1, char scan2, unsigned char shift);
    
    struct key_func
    {
    	KeyDown_T Key_down;
    	KeyPress_T Key_press;
    	KeyUp_T Key_up;
    	unsigned char Activ;
    }Key_Functionen;
    
    void Add_KeyDown(KeyDown_T Func)
    {
    	Key_Functionen.Key_down = Func;
    }
    
    void Add_KeyPress(KeyPress_T Func)
    {
    	Key_Functionen.Key_press = Func;
    }
    
    void Add_KeyUp(KeyUp_T Func)
    {
    	Key_Functionen.Key_up = Func;
    }
    

Anmelden zum Antworten