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; }