Forum: Mikrocontroller und Digitale Elektronik Problem mit struct bei einer Funktion


von Tobias B. (horschtx)


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

von NSA (Gast)


Lesenswert?

In welcher Zeile zeigt der Compiler den Error?
Am besten den ganzen Sourcecode Posten (als Anhang!)

von Karl H. (kbuchegg)


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.

: Bearbeitet durch User
von Falk B. (falk)


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
}

von Tobias B. (horschtx)


Lesenswert?

Falk Brunner schrieb:
> Man sollte besser einen Typ definieren, das ist in der Praxis DEUTLICH
> günstiger zu handhaben.

Danke schön, das hat geholfen

von Rolf M. (rmagnus)


Lesenswert?

Falk Brunner schrieb:
> Man sollte besser einen Typ definieren, das ist in der Praxis DEUTLICH
> günstiger zu handhaben.

Also so DEUTLICH finde ich das nicht und hab kein Problem damit, structs 
ohne typedef zu nutzen.

von Dirk B. (dirkb2)


Lesenswert?

Wenn man die Definitionszeile der Funktion auch zur Deklaration nimmt, 
bekommt man (bei sinnvollen Varablennamen) auch gleich eine 
Kurzdokumentation.

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.