www.mikrocontroller.net

Forum: Compiler & IDEs StrukturArray beinhaltet wieder einen StrukturArray


Autor: Marcel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :)

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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...)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da sind mehrere Probleme
 struct {
   void (*Show_Func)(void); //Zeigt den Namen oder den Wert
   void (*Operate_func)(void); //Geht in das entprechende Untermenü
}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.
struct Menueeintrag {
  void (*Show_Func)(void); //Zeigt den Namen oder den Wert
  void (*Operate_Func)(void); //Geht in das entprechende Untermenü
};

Hier hast du Pech
struct Menue {
  uint8_t Eintraege;
  struct Menueeintrag SubMenues[];
};
Du kannst hier nicht ein nicht näher in der Größe bezeichnetes Array 
benutzen.

        {//OPTIONS
         .Show_Func    = &Show_String;
         .Operate_Func = &Go_Into;
        }
Initialisierungen werden mit , getrennt
#include <stdint.h>

struct Menueeintrag {
  void (*Show_Func)(void); //Zeigt den Namen oder den Wert
  void (*Operate_Func)(void); //Geht in das entprechende Untermenü
};

void Show_String( void );
void Go_Into( void );
void Display_OFF( void );
void Change_Date( void );
void Go_Back( void );

struct Menue {
  uint8_t Eintraege;
  struct Menueeintrag SubMenues[2];
};

struct Menue AllMenues[2] =
  {
    {//Hauptmenue
      .Eintraege = 2,
      .SubMenues =   //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 =  //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
        }
      }
    }
  };

int main()
{
}

Autor: Marcel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: dagger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
[c]
printf("Hello World!");
[/c]
wird dann
printf("Hello World!");
für alles weitere gibts die Vorschau. ;-)

Autor: Einer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau mal ein bischen weiter unten unter FORMATIERUNG.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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
[c]
 ... C-Quelltext ...
[/c]

Steht übrigens direkt über dem eigenen Beitrag, wenn man postet.

>
> Vielen Dank Marcel

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: Marcel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nochmals vielen Dank,
ich werde mir das nächste Mal noch mehr Mühe machen meine Fragestellung 
und die Code-Fragmente zu konkretisieren :)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.