Forum: Mikrocontroller und Digitale Elektronik LCD Menü "error: conflicting types" / "incompatible pointer type"


von Michael (c0d3z3r0)


Lesenswert?

Hallo,

ich versuche gerade ein LCD Menü nach der Vorlage hier zu realisieren...
Beitrag "Re: LCD Menü"

Hier mal der relevante Code:
1
typedef struct MENU {
2
  const uint8_t *text;
3
  struct MENU *parent;
4
  struct MENU *child;
5
  void ( *fp )( void );
6
} MENU_ENTRY;
7
8
struct MENU *menu = menu_0; // Zeile 3
9
// menu = menu_1; funktioniert nicht (siehe Fehler)
10
11
static uint8_t item = 0;
12
13
const uint8_t menu0_item1_string[] = "M0 M1";  
14
const uint8_t menu0_item2_string[] = "M0 M2";
15
16
const uint8_t menu1_item1_string[] = "M1 E1";  
17
const uint8_t menu1_item2_string[] = "M1 E2";
18
const uint8_t menu1_item3_string[] = "M1 E3";
19
20
const MENU_ENTRY menu_0[] = {      
21
  { menu0_item1_string, 0, menu_1, 0 }, 
22
  { menu0_item2_string, 0, menu_2, 0 }
23
};
24
25
const MENU_ENTRY menu_1[] = {      
26
  { menu1_item1_string, menu_0, 0, 0 },
27
  { menu1_item2_string, menu_0, 0, 0 },
28
  { menu1_item3_string, menu_0, 0, 0 }
29
};
30
void print_menu(void){
31
  
32
  lcd_clear();
33
  lcd_string(menu[item].text);
34
  lcd_setcursor(0,1);
35
  //lcd_string(*menu[item+1].text);
36
  
37
}

Außer ein paar Warnungen wird das ganze kompiliert und der Menüeintrag 
wird auch ausgegeben.

Versuche ich aber den Pointer mit "menu = menu_1" zu ändern, erhalte ich 
den folgenden Fehler:
1
menu.c:4:1: warning: data definition has no type or storage class [enabled by default]
2
menu.c:4:1: warning: type defaults to 'int' in declaration of 'menu' [enabled by default]
3
menu.c:4:1: error: conflicting types for 'menu'
4
menu.c:3:14: note: previous definition of 'menu' was here
5
menu.c:4:8: warning: initialization makes integer from pointer without a cast [enabled by default]
6
7
menu.c: In function 'print_menu':
8
menu.c:39:17: error: subscripted value is neither array nor pointer nor vector

Was mache ich denn falsch? :-(
Danke schonmal!

von troll (Gast)


Lesenswert?

Setz mal die Definition von menu_0 vor die Zuweisung. Warnungen sollte 
man grundsätzlich ernst nehmen.

von Michael (c0d3z3r0)


Lesenswert?

Danke für die flotte Antwort :)

Das ist bereits in der Headerdatei passiert.
1
typedef struct MENU {
2
  const uint8_t *text;
3
  struct MENU *parent;
4
  struct MENU *child;
5
  void ( *fp )( void );
6
} MENU_ENTRY;
7
8
9
typedef void (*function) (void);
10
11
const MENU_ENTRY menu_0[];
12
const MENU_ENTRY menu_1[];
13
const MENU_ENTRY menu_2[];
14
15
//void io_conf(uint8_t *DDR, uint8_t *P[], uint8_t direction);
16
void print_menu(void);

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Michael Niewöhner schrieb:
> const MENU_ENTRY menu_0[];
> const MENU_ENTRY menu_1[];
> const MENU_ENTRY menu_2[];

Da fehlt das extern.

von Michael (c0d3z3r0)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Michael Niewöhner schrieb:
>> const MENU_ENTRY menu_0[];
>> const MENU_ENTRY menu_1[];
>> const MENU_ENTRY menu_2[];
>
> Da fehlt das extern.

Ändert leider nichts. Braucht man des extern nicht nur, wenn man die 
Variable / den Pointer außerhalb in ner anderen *.c Datei verwendet?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Michael Niewöhner schrieb:
> Versuche ich aber den Pointer mit "menu = menu_1" zu ändern, erhalte ich
> den folgenden Fehler:

Das wäre eine Zuweisung, keine Initialisierung. Zuweisungen aber sind 
nur innerhalb von Funktionen möglich.

von Michael (c0d3z3r0)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Michael Niewöhner schrieb:
>> Versuche ich aber den Pointer mit "menu = menu_1" zu ändern, erhalte ich
>> den folgenden Fehler:
>
> Das wäre eine Zuweisung, keine Initialisierung. Zuweisungen aber sind
> nur innerhalb von Funktionen möglich.

Manchmal kann die Lösung so einfach sein...  Danke! Funktioniert :D

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.