www.mikrocontroller.net

Forum: Compiler & IDEs Variables LCD-Menü


Autor: Tobias Gärtner (tobster)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe da ein kleines Verständnisproblem mit dem folgenden
Code-Ausschnitt: Ich möchte mir ein Menü für ein LCD basteln mit dem
ich in beinahe beliebige Anzahl Untermenüs hin und her wechseln kann.

Dazu müsste ich mir natürlich das aktuelle Menü irgendwie merken, was
mit der Variable cur_menu funktionieren soll. Allerdings schaffe ich es
nicht die Variable auch nur mit einem der definierten Menü-Strukturen
ohne das Werfen von Fehlern zu initialisieren.

Die Strukturen funktionieren ansich (zumindestens ohne Fehler). Mir
geht es nur um die Deklaration der Variable und deren Wertzuweisung.

================================================

typedef struct MENU_ENTRY {
  const unsigned char *text;
  int8_t prev;
  int8_t next;
  struct MENU_ENTRY *parent;
  struct MENU_ENTRY *sub;
  int8_t *value;
  int8_t max_value;
  void *(*fp)(void);
} MENU_t;

MENU_t *cur_menu[];

const MENU_t main_menu[];

const MENU_t config_menu[] PROGMEM = {
  { confmenu,  -1,  1, (MENU_t*)main_menu, NULL, NULL, -1, NULL },
  { sensor1,    0,  2, NULL, NULL, NULL, 1, NULL },
  { sensor2,    1,  3, NULL, NULL, NULL, 1, NULL },
  { sensor3,    2,  4, NULL, NULL, NULL, 1, NULL },
  { sensor4,    3,  5, NULL, NULL, NULL, 1, NULL },
  { sensor5,    4,  6, NULL, NULL, NULL, 1, NULL },
  { sensor6,    5,  7, NULL, NULL, NULL, 1, NULL },
  { sensor7,    6,  8, NULL, NULL, NULL, 1, NULL },
  { sensor8,    7,  9, NULL, NULL, NULL, 1, NULL },
  { limiter,    8, -1, NULL, NULL, NULL, -1, NULL }
};

const MENU_t transfer_menu[] PROGMEM = {
  { trnsmenu,  -1, 15, (MENU_t*)main_menu, NULL, NULL, -1, NULL },
  { strtuart,  14, 16, NULL, NULL, NULL, -1, NULL }, //über UART
senden
  { baud,      15, 17, NULL, NULL, NULL, 5, NULL },
  { limiter,   16, -1, NULL, NULL, NULL, -1, NULL }
};

const MENU_t main_menu[] PROGMEM = {
  { mainmenu,  -1,  1, NULL, NULL, NULL, -1, NULL },
  { config,     0,  2, NULL, (MENU_t*)config_menu, NULL, -1, NULL },
  { transfer,   1,  3, NULL, (MENU_t*)transfer_menu, NULL, -1, NULL },
  { limiter,    2, -1, NULL, NULL, NULL, -1, NULL }
};

[...]

*cur_menu = (MENU_t*)pgm_read_word(&main_menu);

Autor: Tobias Gärtner (tobster)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wirklich keiner da, de sich mit solchen Zeigerproblemen auskennt?

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin Tobias,

etwas schwer, sich da auf die Schnelle hineinzudenken, aber sollte
es nicht heissen:

MENU_t *cur_menu;

...

cur_menu = pgm_read_word(&main_menu);

Wenn pgm_read_word richtig deklariert ist, sollte der cast unnötig sein
- falls es nicht eine Funktion aus einem anderen Context ist, die/den
ich nicht kenne. Eine Compiler-Warnung ist da eher Zeichen eines
vergessenen oder falschen Prototyps.

Was ich auch nicht verstehe: Warum übergibst Du die Adresse des Menüs?
Als Feld ist es doch bei der Übergabe sowieso ein Zeiger.

Wenn Du noch etwas mehr von Deinen Pgm postest, will ich es mir gern
noch einmal anschauen - denn mit einem ähnlichen Menüsystem gehe ich
auch gerade 'schwanger'.

Gruß, 73,
Jens

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.