Moin zusammen, ich bin gerade dabei eine Menüführung zu gestalten. Hier meine folgende Überlegung: Ich habe zwei Strukturen > struct { > void (*Show_Func)(void); //Zeigt den Namen oder den Wert > void (*Operate_func)(void); //Geht in das entprechende Untermenü > }Menueeintrag; > struct { > uint8_t Eintraege; > struct Menueeintrag SubMenues[]; > }Menue; AllMenues[0]-MainMenue +--------------------+ | Eintraege 4 | | (Menueeintrag)Submenues o--------------- +--------------------+ | | v | Submenues[0] v +--------------------+ (ALLMenues[1]) |&Show_String (Fkt-Ptr) |&Go_Into (Fkt-Ptr) +--------------------+ | | v Submenues[1] AllMenues[0] ist beispielsweise das Hauptmenue, wobei Submenue[0] bsp ds Einstellungsmenue ist, wo entweder der String angezeigt wird oder in das Menue Einstellungen gegangen wird (Die Go_Into Funktion springt dann in ALLMenues[1]. Soweit meine Überlegungen. Wenn ich versuche dieses Diagramm in C zu prgrammieren, dann mekkert er leider an einigen Stellen - doch finde ich den Fehler leider nicht :( - Wäre nett wenn ihr mir dabei helfen könntet. struct Menue AllMenues[2] = { {//Hauptmenue .Eintraege = 2 .SubMenues[2] //request for member 'SubMenues' in something not a //structure or union { //expected expression before '{' token {//OPTIONS .Show_Func = &Show_String; .Operate_Func = &Go_Into; } {//SLEPP-Mode .Show_Func = &Show_String; .Operate_Func = &Display_OFF; } } }, {//Einstellungen //extra brace group at end of initializer //(near initialization for 'AllMenues[0]') .Eintraege = 2; .Submenues[2] //request for member 'SubMenues' in something not a //structure or union { //expected '}' before '{' token {//Datum ändern .Show_Func = &Show_String; .Operate_Func = &Change_Date; } {//Zurueck .Show_Func = &Show_String; .Operate_Func = &Go_Back; } } } }; Vielen Dank im Vorraus :)
Nö. Kein Quelltext, keine Fehlerbeschreibung, keine Hilfe. Anm: "mekkert er leider an einigen Stellen" ist keine Meldung vom Compiler. (Gibt es eigentlich überhaupt noch jemanden, der so fragt, daß man auch eine Chance hat zu helfen? Immerhin: lesbar, ordentlich geschrieben, und ich habe auch eine Ahnung, was falsch ist. Aber das wäre genau genommen Spekulation bei der Beschreibung...)
Da sind mehrere Probleme
1 | struct { |
2 | void (*Show_Func)(void); //Zeigt den Namen oder den Wert |
3 | void (*Operate_func)(void); //Geht in das entprechende Untermenü |
4 | }Menueeintrag; |
Das definiert eine Variable namens Menueeintrag von einem nicht näher genannten (anonymen) struct Datentyp. Du willst aber eigentlich einen Datentyp namens Menueeintrag kreieren, dessen Strukturaufbau beschrieben wird.
1 | struct Menueeintrag { |
2 | void (*Show_Func)(void); //Zeigt den Namen oder den Wert |
3 | void (*Operate_Func)(void); //Geht in das entprechende Untermenü |
4 | };
|
Hier hast du Pech
1 | struct Menue { |
2 | uint8_t Eintraege; |
3 | struct Menueeintrag SubMenues[]; |
4 | };
|
Du kannst hier nicht ein nicht näher in der Größe bezeichnetes Array benutzen.
1 | {//OPTIONS |
2 | .Show_Func = &Show_String; |
3 | .Operate_Func = &Go_Into; |
4 | }
|
Initialisierungen werden mit , getrennt
1 | #include <stdint.h> |
2 | |
3 | struct Menueeintrag { |
4 | void (*Show_Func)(void); //Zeigt den Namen oder den Wert |
5 | void (*Operate_Func)(void); //Geht in das entprechende Untermenü |
6 | };
|
7 | |
8 | void Show_String( void ); |
9 | void Go_Into( void ); |
10 | void Display_OFF( void ); |
11 | void Change_Date( void ); |
12 | void Go_Back( void ); |
13 | |
14 | struct Menue { |
15 | uint8_t Eintraege; |
16 | struct Menueeintrag SubMenues[2]; |
17 | };
|
18 | |
19 | struct Menue AllMenues[2] = |
20 | {
|
21 | {//Hauptmenue |
22 | .Eintraege = 2, |
23 | .SubMenues = //request for member 'SubMenues' in something not a |
24 | //structure or union
|
25 | { //expected expression before '{' token |
26 | |
27 | {//OPTIONS |
28 | .Show_Func = &Show_String, |
29 | .Operate_Func = &Go_Into |
30 | },
|
31 | |
32 | {//SLEPP-Mode |
33 | .Show_Func = &Show_String, |
34 | .Operate_Func = &Display_OFF |
35 | }
|
36 | }
|
37 | },
|
38 | |
39 | {//Einstellungen //extra brace group at end of initializer |
40 | //(near initialization for 'AllMenues[0]')
|
41 | |
42 | |
43 | .Eintraege = 2, |
44 | .SubMenues = //request for member 'SubMenues' in something not a |
45 | //structure or union
|
46 | { //expected '}' before '{' token |
47 | |
48 | {//Datum ändern |
49 | .Show_Func = &Show_String, |
50 | .Operate_Func = &Change_Date |
51 | },
|
52 | |
53 | {//Zurueck |
54 | .Show_Func = &Show_String, |
55 | .Operate_Func = &Go_Back |
56 | }
|
57 | }
|
58 | }
|
59 | };
|
60 | |
61 | int main() |
62 | {
|
63 | }
|
Vielen Dank Karl Heinz :)
Interessant,dass du meine Frage perfekt antworten konntest, Klaus
Wachtler jedoch Probleme hatte meine Fragestellung zu finden.
PS: Diese Strukturdarstellung hatte ich aus einem früheren Beitrag von
dir zum Thema Struktur :)
Karl heinz Buchegger schrieb:
> Hier hast du Pech
Dann werde ich wohl für jedes Menue Hauptmenue, Einstellungen.. ein
weiteres Menue erzeugen
An Klaus:
Die Stellen hatte ich doch exta per Kommentar eingefügt und das ist eine
komplette Headerdatei - also Quelltext ist vorhanden. Wie kann ich
besser machen?
Wie füge ich denn in meine Fragestellung das Syntaxhighliting von C ein?
Vielen Dank Marcel
Marcel schrieb:
> Wie füge ich denn in meine Fragestellung das Syntaxhighliting von C ein?
Packe ihn in C-Quotes, unter Formatierung kannst du es nachlesen.
Bsp:
Aus
1 | [c] |
2 | printf("Hello World!"); |
[/c] wird dann
1 | printf("Hello World!"); |
für alles weitere gibts die Vorschau. ;-)
Schau mal ein bischen weiter unten unter FORMATIERUNG.
Marcel schrieb: > Vielen Dank Karl Heinz :) > > Interessant,dass du meine Frage perfekt antworten konntest, Klaus > Wachtler jedoch Probleme hatte meine Fragestellung zu finden. Weil ich gar nicht erst lange gesucht habe. Du hast minimale Fragemente deines Programms geliefert. KHB hat sich die Mühe gemacht, darin zu suchen. hätte ich auch machen können. Er hat da wohl mehr Geduld als ich - siehe die ganzen anderen missratenen Threads z.B. von heute. Warum habe ich nicht lange gesucht? Weil ich von jemandem, der hier für lau Hilfe erwartet, auch etwas erwarte: - Das Problem möglichst weit reduzieren, damit sich jemand leicht zurecht findet, ohne sich durch Ballast zu quälen - Dazu den vollständigen Quelltext liefern - Weiterhin den Fehler ordentlich beschreiben (nicht "geht nicht" oder "Compiler meckert", sondern exakte Fehlermeldung des Compilers mit Angabe der Zeile) - Das ganze ordentlich und lesbar beschreibt (hattest du ja, nur der Vollständigkeit halber) Das würde die Suche deutlich beschleunigen, aber macht das Fragen schwerer. Das finde ich fair, wenn jemand andere Leute beschäftigt. > ... > > An Klaus: > > Die Stellen hatte ich doch exta per Kommentar eingefügt und das ist eine > komplette Headerdatei - also Quelltext ist vorhanden. Wie kann ich > besser machen? Siehe oben: genaue Meldungen des Compilers, komplette (aber möglichst eingedampfte) Quelltexte. > > Wie füge ich denn in meine Fragestellung das Syntaxhighliting von C ein? Mit
1 | [c] |
2 | ... C-Quelltext ... |
3 | [/c] |
Steht übrigens direkt über dem eigenen Beitrag, wenn man postet. > > Vielen Dank Marcel
Klaus Wachtler schrieb: > KHB hat sich die Mühe gemacht, darin zu suchen. hätte ich auch > machen können. Er hat da wohl mehr Geduld als ich - siehe > die ganzen anderen missratenen Threads z.B. von heute. Ich bin aus der Fehlermeldung nicht schlau geworden. Also hab ich das Fragment in ein AVR Studio kopiert und hab den Cmopiler drüber gejagt. Und dann einen Fehler nach dem anderen sukzessive ausgemerzt. Genau darum ist es auch für den Fragesteller wichtig, immer möglichst komplierbaren (*) Code zu posten. Bei dir haben dem ersten Augenschein nach nicht viele Dinge gefehlt. Wenn du allerdings noch ein paar Sachen weggelassen hättest, hätte ich mir die Arbeit nicht gemacht :-) (*) komplierbar im Sinne von: Ich kann das Teil nehmen und den Compiler drüberjagen ohne zuerst 100-tausend Dinge, die mit dem eigentlichen Problem nichts zu tun haben ergänzen zu müssen. Wenn ich ein paar Funktionsprototypen ergänzen muss und aus dem Kontext sehen kann wie die aussehen müssen, dann gehts schneller wenn ich die einfüge. Wenn ich aber halbe Strukturen erraten muss, über Codeteile erst mal Funktionsköpfe stülpen muss, nur um die ersten 15 Fehlermeldungen wegzukriegen bis dann endlich die fragliche Fehlermeldung übrig bleibt, dann pfeiff ich drauf :-)
Nochmals vielen Dank, ich werde mir das nächste Mal noch mehr Mühe machen meine Fragestellung und die Code-Fragmente zu konkretisieren :)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.