Autor Thema: Problem mit Zeiger auf Funktionen.  (Gelesen 2497 mal)

Hauke

  • Beiträge: 113
    • Profil anzeigen
Gespeichert
« am: 25. October 2008, 17:48 »
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.

Termite

  • Beiträge: 239
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 25. October 2008, 19:34 »
Nabend

1. legt für deine funktionenspyter in der struktur erst mal typedefs an, anstelle sie direkt in der struktur zu definieren. die wirst du öfters mal brauchen. (struktur, Funktionsparameter, ggf für casts, ... )  witer wegen der type prüfung beim übersetzen. (damit passiern weniger fehler)
2. leg 3 Add funktionen an. z.B. addKeyDown, addKeyUp, addKeyPress
3. verwende als parameter die unter 1 definierte typedefs als parameter.


    typedef int (*(KeyDown_T)(unsigned char scan1, unsigned char scan2, unsigned char shift));

struct key_funk
{
   KeyDown_T Key_down;
}

void addKeyDown( KeyDown_T fktptr)
{
   Key_Vunction.Key_down = fktptr;
}

2 hat den grund, da dur verschiedene Parameterlisten hast, damit must du nicht den funktionspointer unnötig durch die gegend kasten. den ohne cast wird sich das warscheinlich nicht übersetzen lassen. dein problem ist, das du bei deiner add implementierung eine funktion übergeben willst. das muss aber ein funktionspointer sein. ( daher auch der typedef, der einen funktionspointer definiert)


ggf hilft das auch weiter http://www.math.uni-wuppertal.de/~axel/skripte/oop/oop7_9.html

gruss

Hauke

  • Beiträge: 113
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 26. October 2008, 12:53 »
Ich hab das jetzt so gemacht:
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_Keydown(KeyPress_T Func)
{
Key_Functionen.Key_press = Func;
}

void Add_Keydown(KeyUp_T Func)
{
Key_Functionen.Key_up = Func;
}
Und dann kommen diese Fehlermedungen heraus:
driver.cpp:255: error: invalid use of member (did you forget the '&' ?)
driver.cpp: In function 'void Add_Keydown(int* (*)(char))':
driver.cpp:260: error: invalid use of member (did you forget the '&' ?)
driver.cpp: In function 'void Add_Keydown(int* (*)(char, char, unsigned char))':

driver.cpp:263: error: redefinition of 'void Add_Keydown(int* (*)(char, char, un
signed char))'
driver.cpp:253: error: 'void Add_Keydown(int* (*)(char, char, unsigned char))' p
reviously defined here
driver.cpp:265: error: invalid use of member (did you forget the '&' ?)

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 26. October 2008, 14:11 »
Also 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));
tut nicht das was du willst. Mein Compiler (GCC) sagt mir das auch:
fp.c:7: error: field 'Key_down' declared as a function
fp.c:8: error: field 'Key_press' declared as a function
fp.c:9: error: field 'Key_up' declared as a function
Holt euch auch mal richtige Compiler. (Edit: ich seh gerade, dass die unklare Meldung an C++ liegt ... lasst die Finger von C++ ;))

Probier mal:
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);

Die anderen Fehler stammen daher, dass du wohl wegen Copy und Paste 3x Add_Keydown stehen hast.
« Letzte Änderung: 26. October 2008, 14:15 von PorkChicken »
Dieser Text wird unter jedem Beitrag angezeigt.

Hauke

  • Beiträge: 113
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 26. October 2008, 16:11 »
So funktioniert es jetzt.
Danke :-)

 

Einloggen