mikrocontroller.net

Forum: Compiler & IDEs [CodeVision] variablen C struct in Funktion übergeben für Menübeschreibung


Autor: Christoph S. (mcseven)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi *,

ich stehe vor folgendem Problem:
Ich habe eine Grafikroutine, die soll ein (Text-)Menü mit mehreren 
Auswahlmöglichkeiten zeichnen. Außerdem ist die Routine animiert, das 
bedeutet, ich muß ihr mehrere Texte übergeben, die dann immer Pixelweise 
verschoben werden.

Das Problem ist, dass jedes Menü unterschiedlich ist, mal sind es 10 
Möglichkeiten, mal nur 5.

Ein Struct dagegen ist ja mehr oder weniger fest definiert.

Struktur im Menü:
{
  unsigned char Menueueberschrift[10];
  unsigned char AnzahlMenueItems;
  unsigned char Menueitems[][10]; //Das mag der CodeVision nicht, ein
  // char-array muss in jeder dimension festgelegt werden,
  // also z.B. Menuitems[5][10]
  // würde aber ne gigantische Platzverschwendung, wenn ich mal
  // ein menü mit nur einem statt 5 items hätte
}

Also z.B.
{
  "TESTHead1"
  2
  {"Test12345", "Test15"}
}

aber auch
{
  "TESTHead2"
  4
  {"Test12349", "Test17", "Test14", "Test1"}
}

Selbstverständlich könnte man die Anzahl der Items irgendwo 
rausbekommen, ich weiß nur nicht mit welcher Funktion. Aber wie kann ich 
so einen "variablen" struct definieren und wie sähe die 
Funktionsdefinition aus?

void glcd_drawMenu(flash struct *lalala, char oldItem, char 
selectedItem) {
  //tu was
}

Anmerkung: die beiden Chars brauche ich für die Animation, damit ich 
weiß, von wo nach wo ich scrollen muss...

Danke,
Christoph

Autor: T. H. (pumpkin) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Machs mit einer verketteten Liste.

Autor: Christoph S. (mcseven)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und wie definiere ich in nem Struct ne verkettete Liste, bzw. wie 
definiere ich im Programmspeicher die Daten für die verkettete Liste?

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du kannst ein array of pointers machen:

const char *s[] = { "Hi", "low", "foo", "bar"};

Wenn du das aber zum Bestandteil einer struct machen willst, dann
setzt das voraus, dass der Compiler "flexible array members" gemäß
C99 kennt (GCC, in dessen Forum du ja postest, kann das), und dieses
Array muss sich am Ende der struct befinden.  Leider lässt sich der
Trick "sizeof(array) / sizeof(array[0])" für ein solches in der
Initialisierung nicht anwenden, du musst die Elemente also schon
mit der Hand zählen.

Der Speicherplatz für die Strings selbst wird dabei vom Compiler
anonym belegt, und es wird nur ein Zeiger auf den Anfang eines jeden
Strings im Array gespeichert.

Autor: Christoph S. (mcseven)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

Danke Dir für Deine Antwort.
also ich habe jetzt:
flash struct Menu {
  unsigned char Header[16];
  unsigned int ItemCount;
  unsigned char *Items[];
} MainMenu[2] = {
  { 
    "Konfiguration",
    6,
    {"Uhrzeit/Datum", "Temperatur",  "Display", "DCF77", "Wecker", "-- Zurück --" }
  },
  { 
    "Configuration",
    6,
    {"Time/Date",     "Temperature", "Display", "DCF77", "Alarm Clock", "-- Back --"}
  }
};

Der Compiler compiliert, der Assembler allerdings wirft einen Fehler:
_MainMenu:
  .DB  0x4B,0x6F
  .DB  0x6E,0x66
  .DB  0x69,0x67
  .DB  0x75,0x72
  .DB  0x61,0x74
  .DB  0x69,0x6F
  .DB  0x6E,0x0
  .DB  0x0,0x0
  .DB  0x6,0x0
  .DB  LOW(_3+0x00),HIGH(_3+0x00)
  .DB  LOW(_3+0x0E),HIGH(_3+0x0E)
  .DB  LOW(_3+0x19),HIGH(_3+0x19)
  .DB  LOW(_3+0x21),HIGH(_3+0x21)
  .DB  LOW(_3+0x27),HIGH(_3+0x27)
  .DB  LOW(_3+0x2E),HIGH(_3+0x2E)
  .DB  0x43,0x6F
  .DB  0x6E,0x66
  .DB  0x69,0x67
  .DB  0x75,0x72
  .DB  0x61,0x74
0x690x6F //###### HIER Fehler unexpected INT
0x6E0x0
0x00x0
0x60x0
LOW(_4+0x00)HIGH(_4+0x00)
LOW(_4+0x0A)HIGH(_4+0x0A)
LOW(_4+0x16)HIGH(_4+0x16)
LOW(_4+0x1E)HIGH(_4+0x1E)
LOW(_4+0x24)HIGH(_4+0x24)
LOW(_4+0x30)HIGH(_4+0x30)
  .DEF _spitemp=R5
  .DEF _contrast=R4
  .DEF _screenstate=R7
  .DEF _menustate=R6
  .DEF _old_menustate=R9
  .DEF _i=R8
  .DEF _month=R11

Was mach ich denn falsch? Oder ist der Compiler schuld?

Und wäre folgender Code dann richtig:
unsigned int getMenuItemCount(flash Menu *menuToPaint) {
  unsigned char nrOfItems;
  //z.B. Anzahl der Items bekommen:
  nrOfItems = menuToPaint->ItemCount;
  return nrOfItems;
}

unsigned int tempCount;
tempCount = getMenuItemCount(MainMenu[0]); //tempCount = 6
tempCount = getMenuItemCount(MainMenu[1]); //tempCount = 6

Danke,
Christoph

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.