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
Machs mit einer verketteten Liste.
Und wie definiere ich in nem Struct ne verkettete Liste, bzw. wie definiere ich im Programmspeicher die Daten für die verkettete Liste?
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.
Hi, Danke Dir für Deine Antwort. also ich habe jetzt:
1 | flash struct Menu { |
2 | unsigned char Header[16]; |
3 | unsigned int ItemCount; |
4 | unsigned char *Items[]; |
5 | } MainMenu[2] = { |
6 | {
|
7 | "Konfiguration", |
8 | 6, |
9 | {"Uhrzeit/Datum", "Temperatur", "Display", "DCF77", "Wecker", "-- Zurück --" } |
10 | },
|
11 | {
|
12 | "Configuration", |
13 | 6, |
14 | {"Time/Date", "Temperature", "Display", "DCF77", "Alarm Clock", "-- Back --"} |
15 | }
|
16 | };
|
Der Compiler compiliert, der Assembler allerdings wirft einen Fehler:
1 | _MainMenu: |
2 | .DB 0x4B,0x6F |
3 | .DB 0x6E,0x66 |
4 | .DB 0x69,0x67 |
5 | .DB 0x75,0x72 |
6 | .DB 0x61,0x74 |
7 | .DB 0x69,0x6F |
8 | .DB 0x6E,0x0 |
9 | .DB 0x0,0x0 |
10 | .DB 0x6,0x0 |
11 | .DB LOW(_3+0x00),HIGH(_3+0x00) |
12 | .DB LOW(_3+0x0E),HIGH(_3+0x0E) |
13 | .DB LOW(_3+0x19),HIGH(_3+0x19) |
14 | .DB LOW(_3+0x21),HIGH(_3+0x21) |
15 | .DB LOW(_3+0x27),HIGH(_3+0x27) |
16 | .DB LOW(_3+0x2E),HIGH(_3+0x2E) |
17 | .DB 0x43,0x6F |
18 | .DB 0x6E,0x66 |
19 | .DB 0x69,0x67 |
20 | .DB 0x75,0x72 |
21 | .DB 0x61,0x74 |
22 | 0x690x6F //###### HIER Fehler unexpected INT |
23 | 0x6E0x0 |
24 | 0x00x0 |
25 | 0x60x0 |
26 | LOW(_4+0x00)HIGH(_4+0x00) |
27 | LOW(_4+0x0A)HIGH(_4+0x0A) |
28 | LOW(_4+0x16)HIGH(_4+0x16) |
29 | LOW(_4+0x1E)HIGH(_4+0x1E) |
30 | LOW(_4+0x24)HIGH(_4+0x24) |
31 | LOW(_4+0x30)HIGH(_4+0x30) |
32 | .DEF _spitemp=R5 |
33 | .DEF _contrast=R4 |
34 | .DEF _screenstate=R7 |
35 | .DEF _menustate=R6 |
36 | .DEF _old_menustate=R9 |
37 | .DEF _i=R8 |
38 | .DEF _month=R11 |
Was mach ich denn falsch? Oder ist der Compiler schuld? Und wäre folgender Code dann richtig:
1 | unsigned int getMenuItemCount(flash Menu *menuToPaint) { |
2 | unsigned char nrOfItems; |
3 | //z.B. Anzahl der Items bekommen:
|
4 | nrOfItems = menuToPaint->ItemCount; |
5 | return nrOfItems; |
6 | }
|
7 | |
8 | unsigned int tempCount; |
9 | tempCount = getMenuItemCount(MainMenu[0]); //tempCount = 6 |
10 | tempCount = getMenuItemCount(MainMenu[1]); //tempCount = 6 |
Danke, Christoph
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.