Struct Vorwärtsdeklaration

OP #2217717
Lesenswert?

Hallo Leute, ich hab folgendes "typedef struct":
1
typedef struct {
2
  unsigned char ThisState;
3
  unsigned char Key_UP_State;
4
  unsigned char Key_DOWN_State;
5
  unsigned char Key_LEFT_State;
6
  unsigned char Key_ENTER_State;
7
  const unsigned char*   pText0;
8
  const unsigned char*   pText1;
9
  const unsigned char*   pText2;
10
  const unsigned char*   pText3;
11
  unsigned char Cursor_X;
12
  unsigned char Cursor_Y;
13
  void (*pFunc)(TYPE_MENU_STATE *Menu_State);
14
  int Func_Param;
15
}TYPE_MENU_STATE;

Wie schaffe ich es, dass der Übergabeparameter der (*pFunc)-Funktion 
schon innerhalb des structs bekannt ist, obwohl sich die Strucktur ja 
gerade erste selber definiert? Weiterhin muss dieses typedef in einer 
Header-Datei stehen.

Danke!
Gast #2217734
Lesenswert?

Du kannst der struct einen Namen geben, den du dann einfach nicht weiter 
verwendest:
1
typedef struct type_menu_state_struct{
2
  unsigned char ThisState;
3
  unsigned char Key_UP_State;
4
  unsigned char Key_DOWN_State;
5
  unsigned char Key_LEFT_State;
6
  unsigned char Key_ENTER_State;
7
  const unsigned char*   pText0;
8
  const unsigned char*   pText1;
9
  const unsigned char*   pText2;
10
  const unsigned char*   pText3;
11
  unsigned char Cursor_X;
12
  unsigned char Cursor_Y;
13
  void (*pFunc)(type_menu_state_struct *Menu_State);
14
  int Func_Param;
15
}TYPE_MENU_STATE;
Gast #2217735
Lesenswert?

>Wie schaffe ich es, dass der Übergabeparameter der (*pFunc)-Funktion
>schon innerhalb des structs bekannt ist,

Das geht nicht. Dein typedef belegt keinen Speicher
und deshalb kann da auch nichts zugewiesen werden.
#2217755
Lesenswert?

Ich mache das immer so:
1
typedef void generic_f (BT_UBYTE argc, BT_UBYTE *argv); 
2

3
typedef struct   
4
  {
5
  BT_UBYTE *nptr;  //command name
6
  generic_f  *fptr; // pointer to function
7
  BT_UBYTE *syntax; //help string
8
}cmd_table;
9

10

11
const cmd_table_elements f[] = {
12
  {"cpb ...... Clear Port-Bit\n",clrpb_cmd,"cpb <port> <bit>\n"},
13
  {"dump ..... Memory Dump\n",dump_cmd,"dump <addr>\n"}
14
}
der Funktionsaufruf erfolgt dann mit:
1
(f[cmd_pos].fptr)(argc,arguments);
Gast #2217771
Lesenswert?

>Die Variante von Heureka funktioniert auf jeden Fall mal nicht. Der
>Compiler meldet einen Fehler vor "type_menu_states_struct"...

>Das muss doch irgendwie gehn...

Schon. Wenn man es richtig macht. :-)

Du hast Dich mit dem Namen "type_menu_state_struct" der struct 
vielleicht auch selbst irrgeführt. Das ist nicht der Name eines Typen 
sondern der eines structs.

In der Parameterdeklaration hast Du diesen Namen type_menu_state_struct 
eben auch an der Stelle eines Typnamens eingesetzt. Mal abgesehen davon 
das Du das dringend umbenennen solltest, wäre die Deklaration dann:
1
typedef struct type_menu_state_struct{
2
  unsigned char ThisState;
3
  unsigned char Key_UP_State;
4
  unsigned char Key_DOWN_State;
5
  unsigned char Key_LEFT_State;
6
  unsigned char Key_ENTER_State;
7
  const unsigned char*   pText0;
8
  const unsigned char*   pText1;
9
  const unsigned char*   pText2;
10
  const unsigned char*   pText3;
11
  unsigned char Cursor_X;
12
  unsigned char Cursor_Y;
13
  void (*pFunc)(struct type_menu_state_struct *Menu_State);
14
  int Func_Param;
15
}TYPE_MENU_STATE;

Und bitte beim nächstenmal auch die Fehlermeldung des Compilers angeben 
und nicht nur die Tatsache vermelden, dass er einen Fehler meldet.
Gast #2217858
Lesenswert?

>Eine Frage noch an "Guru": Was meinst du mit: "Mal abgesehen davon
>das Du das dringend umbenennen solltest"?

Das ergibt sich aus dem Text in dem selben Beitrag von mir.

>Du hast Dich mit dem Namen "type_menu_state_struct" der struct
>vielleicht auch selbst irrgeführt. Das ist nicht der Name eines Typen
>sondern der eines structs.

>In der Parameterdeklaration hast Du diesen Namen type_menu_state_struct
>eben auch an der Stelle eines Typnamens eingesetzt.

Möglicherweise kann ich das noch anders formulieren, wenn Du mir 
schreibst, was genau Du daran nicht verstehst.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren