Problem mit struct bei einer Funktion

OP #3996979
Lesenswert?
• ▲
▼
Hallo Zusammen,

bestimmt kann mir hier jemand helfen. Ich stehe gerade auf dem Schlauch 
und komme nicht weiter.

Ich versuche gerade im Atmel Studio ein Menü zu Programmieren. Habe mir 
auch schon einige Tip´s hier geholt.
Jetzt versuche ich gerade ein struct an eine Funktion zu übergeben. Das 
will aber nicht klappen. Es kommen immer irgendwelche Compiler fehler 
dabei raus und ich finde den Fehler nicht.
Das ganze wird unter dem AVR-Studio Programmiert und soll auf einem 
XMega laufen.
Der Grundsätzlich Aufbau funktioniert auch, ich wollte nur den Code 
einfacher gestalten und ein paar Funktionen einsparen.

Ich mach jetzt einfach mal ausschnitte aus dem Programm. Da es schon 
ziemlich viel Code geworden ist hoffe ich mal das das so reicht um zu 
helfen. Wenn mehr benötigt wird sollte das aber kein Problem sein ;)

Ziel des ganzen ist es eigentlich nur aus einer Funktion her verschieden 
Menüs anzuzeigen.

Das ist mein Protoyp für die Funktion:
1
void draw_menu (uint8_t, struct MenuEntry );

Das ist das struct dazu:
1
struct MenuEntry
2
{
3
  char Text_Zeile1[16];
4
  char Text_Zeile2[18];
5
  MenuFnct Function;
6
  };

Der Aufruf:
1
draw_menu(quelle_posi,QuelleMenu);

Das die Funktion:
1
void draw_menu(uint8_t x, struct MenuEntry menu[])
2
{
3
  lcd_clear();
4
  lcd_setcursor(0,0);
5
  lcd_string(menu[x].Text_Zeile1);
6
  lcd_setcursor(0,1);
7
  lcd_string(menu[x].Text_Zeile2);
8
}

Wenn ich es so versuch zu Compilieren kommt einmal der Fehler:

Error  4  type of formal parameter 2 is incomplete

und dann noch

Error  6  conflicting types for 'draw_menu'

Vielleicht kann mir ja jemand vom "Schlauch" runterhelfen?

Vielen Dank schon einmal im voraus.

Schöner Gruß
Tobias
#3997009
Lesenswert?
• ▲
▼
Tobias B. schrieb:

> Das ist mein Protoyp für die Funktion:
>
1
void draw_menu (uint8_t, struct MenuEntry );

Aha.
Hier sagst du: Die Funktion kriegt als 2. Argument 1 einzelnes Objekt


>
1
void draw_menu(uint8_t x, struct MenuEntry menu[])
2
>

und hier sagst du, die Funktion kriegt ein ganzes Array von Objekten 
(d.h. um genau zu sein sagst du hier eigentlich die Funktoin kriegt 
einen Pointer auf ein Array)

Der springende Punkt ist aber: Ja, was denn nun? Ein einzelnes Objekt 
oder ein Array?


Es ist doch wirklich ganz simpel.
SChreib deine Funktion
1
void draw_menu(uint8_t x, struct MenuEntry menu[])
2
{
3
  lcd_clear();
4
...
5
  lcd_string(menu[x].Text_Zeile2);
6
}

nimm die Zeile mit der Funktionsdefinition mittels Strg+C in den Copy 
Buffer
1
void draw_menu(uint8_t x, struct MenuEntry menu[])

geh an die Stelle, an der du den Protoypen für die Funktion haben willst 
(Header File), setze dort die Zeile mittles Strg+V ein und hänge einen 
';' hinten drann
1
void draw_menu(uint8_t x, struct MenuEntry menu[]);
und fertig ist dein Protoyp.

Und wenn der Compiler wieder die Funktionsdefinition anmäkelt, dann 
siehst du dir nächstes mal die Datentypen aller Argument (inklusive 
Array-[]) genauer an.
#3997026
Lesenswert?
• ▲
▼
Man sollte besser einen Typ definieren, das ist in der Praxis DEUTLICH 
günstiger zu handhaben.
1
typedef struct 
2
{
3
  char Text_Zeile1[16];
4
  char Text_Zeile2[18];
5
  MenuFnct Function;
6
  } MenuEntry_t;
7

8
MenuEntry_t TopMenuEntry;
9

10
void draw_menu (uint8_t, MenuEntry_t *menu);
11

12
void draw_menu(uint8_t x, MenuEntry_t *menu)
13
{
14
  lcd_clear();
15
  lcd_setcursor(0,0);
16
  lcd_string(menu[x].Text_Zeile1);
17
  lcd_setcursor(0,1);
18
  lcd_string(menu[x].Text_Zeile2);
19
}

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