Forum: Mikrocontroller und Digitale Elektronik Struct Vorwärtsdeklaration


von Michael S. (michl-s)


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!

von Heureka (Gast)


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;

von holger (Gast)


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.

von Michael S. (michl-s)


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...

von Timmo H. (masterfx)


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

von Heureka (Gast)


Lesenswert?

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

MSVC2008 compiliert das aber tadellos.

von Volker (Gast)


Lesenswert?

Probier mal:
1
void (*pFunc)(struct type_menu_state_struct *Menu_State);

VG
Volker

von Heureka (Gast)


Lesenswert?

Oh ja, genau, das soll ja C sein, da müsste es wohl 'struct 
type_menu_state_struct' heißen! hatte es als C++ compiliert.

von Guru (Gast)


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.

von Michael S. (michl-s)


Lesenswert?

Das hilft mir jetzt nich wahnsinnig weiter, da bei dir "BT_UBYTE" 
woanders wohl definiert wird und nicht dem struct-Typ entspricht.

von Guru (Gast)


Lesenswert?

Der Beitrag von Timmo H. hat mit Deinem Problem nichts zu tun.

Die Beiträge von Volker, Heureka und meiner Wenigkeit sind die 
passenden.

von Michael S. (michl-s)


Lesenswert?

Okay, danke an alle. So funktioniert es einwandfrei.
Eine Frage noch an "Guru": Was meinst du mit: "Mal abgesehen davon
das Du das dringend umbenennen solltest"?

von Daniel (Gast)


Lesenswert?

1
struct foo;
2
3
struct foo {
4
    void bar(struct foo * pfoo);
5
    int x;
6
};

von Guru (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.