Forum: Compiler & IDEs StrukturArray beinhaltet wieder einen StrukturArray


von Marcel (Gast)


Lesenswert?

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 :)

von Klaus W. (mfgkw)


Lesenswert?

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...)

von Karl H. (kbuchegg)


Lesenswert?

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
}

von Marcel (Gast)


Lesenswert?

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

von dagger (Gast)


Lesenswert?

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. ;-)

von Einer (Gast)


Lesenswert?

Schau mal ein bischen weiter unten unter FORMATIERUNG.

von Klaus W. (mfgkw)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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 :-)

von Marcel (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.