Hi Leute
So ich bin Anfänger und grade beim Versuch in C eine Menüstruktur zu
programmieren. Nur leider komme ich bei meinem Code einfach nicht mehr
weiter.
Ich glaube, dass der Compiler das variable Array in der Menüstruktur
nicht versteht, aber wie kann man das anders Programmieren.
Weiß irgendwer weiter?
1
#include<avr/io.h>
2
#include"lcd-routines.h"
3
#include<avr/pgmspace.h>
4
5
#define ungueltig 0
6
#define L 1
7
#define up 2
8
#define down 3
9
#define R 4
10
#define true 1
11
#define false 0
12
13
14
intinput;//Eingabevariable
15
16
17
/* Menüstruktur */
18
19
typedefstructSubMenue{
20
constcharSubText;//Name des Untermenüs
21
intdata_size;//Größe des Auswahlarrays
22
intdata[data_size];//Auswahlarray Wenn nicht aus einer bestimmten Anzahl an Auswahlmöglichkeiten gewählt werden soll
23
intdata_select;//Ausgewähltes Arrayglied kann data[] und data_size auf NULL gesetzt werden. Es wird dann data_select einfach hoch gezählt
24
}
25
26
structMenue{
27
constcharText;//Name des Menüs
28
intsub_size;//Anzahl der Untermenüs
29
structSubMenuesm[sub_size];//Untermenüarray
30
intsub_select;//Ausgewähltes Untermenü
31
}
32
33
voidwriteMenue(structMenue*pointer)//Schreibt das Menü auf das Display
34
{
35
lcd_clear();
36
lcd_home();
37
lcd_data((*pointer).Text);
38
lcd_setcursor(2,5);
39
lcd_data((*pointer).sm[sub_select].SubText);
40
}
41
42
voidwriteSubMenue(structSubMenue*pointer)//Schreibt das Untermenü auf das Display
43
{
44
lcd_clear();
45
lcd_home();
46
lcd_data((*pointer).SubText);
47
lcd_setcursor(2,5);
48
if((*pointer).data[sub_select]=true)
49
{
50
lcd_data((*pointer).data[sub_select]);
51
}
52
else
53
{
54
lcd_data((*pointer).data_select);
55
}
56
}
57
58
voidlower(int*selected,int*size)//lower und rais zählen mit der Grenze size einen int hoch oder runter
59
{
60
if(selected=0)
61
{
62
selected=size;
63
}
64
else
65
{
66
selected--;
67
}
68
}
69
70
voidrais(int*selected,int*size)
71
{
72
if(selected=size)
73
{
74
selected=0;
75
}
76
else
77
{
78
selected++;
79
}
80
}
81
82
intgetinput(int*input)//getinput soll der Variable input den dem Tastendruck entsprechende Zahl zuweisen
Alex schrieb:> Ich glaube, dass der Compiler das variable Array in der Menüstruktur> nicht versteht,
richtig
> aber wie kann man das anders Programmieren.
Mittels Verpointerungen.
Kauf dir ein C-Buch und sieh zu dass du mit Pointern warm wirst. Ohne
sie kommst du nicht mehr weiter.
Du kannst es so machen, wie kbuchegg geschrieben hat, also mit sizeof
arbeiten. Einfacher finde ich aber, jeweils mit NULL am Ende zu
kennzeichnen, daß das das letzte Element war.
Generell finde ich die Idee das Menü per deklarativen Ansatz in einer
Struktur zu definieren, gut. Dein Code sieht mir aber etwas verworren
aus und man kann auch nicht beliebig tiefe Menüstrukturen definieren,
daher habe ich das eben mal selbst programmiert. Für Microcontroller
wichtig kann auch sein, daß man die Struktur möglichst so anlegt, daß
die aus dem Flash gelesen werden kann. Wenn du dort auch die
selektierten Einträge speicherst, dann geht das wahrscheinlich nicht.
Ich habe daher die gewählte Konfiguration selbst in einem extra Array
(g_configs) abgelegt, was auch das komplette laden und speichern sehr
vereinfacht.
Zum Testen von sowas ist es übrigens immer viel einfacher, das auf dem
PC zu simulieren. Wenn du unter Windows arbeitest, dann kann ich Visual
Studio Express empfehlen, ist kostenlos. Unter Linux ist KDevelop eine
gute Idee. Die Hardwareschicht solltest du davon dann abstrahieren,
sodaß du mit demselben Quelltext einmal eine Simulation für PC
compilieren kannst und einmal für dein Microcontroller-Target.
Hab mir mal n "Universalmenü" zusammengestrickt für beliebige Tiefe,
allerdings nicht in C, das lief so.
Im Prinzip hatte ich 2 Menüarten, Einstellungsmenü und Navigationsmenü.
Die menüs hatten folgende Struktur:
Menüadresse
Menüart (0= Navi, 1= Einstellung)
dann gings auseinander, bei Navimenü kamen darunter die Untermenüs
"einstellung Uhr" Sprungadresse1
"Einstellung Parameter 1" Sprungadresse2
"Einstellung Parameter 2" Sprungadresse3
"Exit Menü" 0
-Ende Menü-
Bei Einstellmenüs kam stattdessen
Parameternummer
Maximalwert
Minimalwert
Anzahl Stufen
Anzahl Dezimalstellen
Aussprungziel
So konnte ich beliebig Menüs aneinander Reihen, z.B. verschiedene
Einstellungen per Aussprungadresse aufreihen oder per Auswahl an
beliebige Einstellungen springen.
Für die Anzeige der Menüs gabs dann entsprechend 2 Programmteile,
die alle Menüs auf LCD oder LED-Anzeige schrieben je nach Menüart.