Hallo, ich schreibe gerade an einem kleinen Menu-teil für mein Projekt. Bisher lief alles OK im Visual Studio. Ich versuche das ganze jetzt in den AVR-GCC zu wandeln habe jetzt aber das Problem, dass ich die Struktur nicht in den Flash schreiben kann. Ich bekomme ständig die Fehlermeldung: menu.cpp:12: error: expected initializer before "PROGMEM" Kann mir bitte jemand Weiterhelfen? Ich will die Struktur myMENU des Typs menu in den Flash schreiben. mfg Alex
Sieht die Synthax für eine Struct-Definition nicht ander aus ? (In C tut sie das auf jeden Fall, ich hab aber keine Ahnung von C++ ) In C bräuchtest du einen Prototyp für den Struct:
1 | struct menu { |
2 | PSTR(string); |
3 | char* einpointer; |
4 | Typ var; // mußt du einsetzen |
5 | }
|
6 | // und deine Deklaration sähe so aus:
|
7 | const struct menu myMENU[] PROGMEM = { |
8 | {"Test1", &SetMenu, test1}, |
9 | {"Test2", &bar, NULL}, |
10 | {"Test3", &foobar, NULL}, |
11 | {"zurück?", NULL, NULL}, |
12 | {"", NULL, NULL} |
13 | };
|
14 | //Du kannst dann "const" und PROGMEM noch in den Prototypen verlagern.
|
Einfach (noch-)mal das Kapitel "Struct" in deinem (C /C++) Buch und das Kapitel "<avr>/pgmspace.h" in der AVR-GCC doku nachschlagen
Den Prototyp habe ich im Header. Das ganze sieht jetzt so aus: cpp-Datei: const struct menu myMENU[] PROGMEM = { {PSTR("Test1"), &SetMenu, test1}, {PSTR("Test2"), &bar, NULL}, {PSTR("Test3"), &foobar, NULL}, {PSTR("zurück?"), NULL, NULL}, {PSTR(""), NULL, NULL} }; Prototyp aus header: struct menu{ const char* text; void (*fp)(struct menu*); struct menu* pUMenu; }; ---------------------------------------- Ich will dass der Compiler mit alle "TEXTE" in den Flash schreibt, sowie die ganze Struktur myMENU. => FLASH soll später stehen: die Texte , die Strukturen die Adressen der Texte in der Struktur, die Adressen der Funktionen in der Struktur, die Adressen der "Untermenus" PSTR gibt mir die Adressen der TEXTE im Flash zurück, der wird in den Char * geschrieben. Trotz allem bekomme ich immernoch die selbe Fehlermeldung: menu.cpp:13: error: expected initializer before "PROGMEM" mfg
Wenn ich es so umschreibe...
1 | #include <avr/pgmspace.h> |
2 | |
3 | struct menu{ |
4 | const char* text; |
5 | void (*fp)(struct menu*); |
6 | struct menu* pUMenu; |
7 | };
|
8 | |
9 | void SetMenu(struct menu*); |
10 | void bar(struct menu*); |
11 | void foobar(struct menu*); |
12 | #define test1 myMENU
|
13 | #define NULL ((void*)0)
|
14 | |
15 | static char text1[] PROGMEM = "Test1"; |
16 | static char text2[] PROGMEM = "Test2"; |
17 | static char text3[] PROGMEM = "Test3"; |
18 | static char text4[] PROGMEM = "zurück?"; |
19 | static char text5[] PROGMEM = ""; |
20 | |
21 | const struct menu myMENU[] PROGMEM = { |
22 | {text1, &SetMenu, test1}, |
23 | {text2, &bar, NULL}, |
24 | {text3, &foobar, NULL}, |
25 | {text4, NULL, NULL}, |
26 | {text5, NULL, NULL} |
27 | };
|
28 | |
29 | void SetMenu(struct menu* m) |
30 | {
|
31 | }
|
32 | |
33 | void bar(struct menu* m) |
34 | {
|
35 | }
|
36 | |
37 | void foobar(struct menu* m) |
38 | {
|
39 | }
|
40 | |
41 | int main(void) |
42 | {
|
43 | return 0; |
44 | }
|
... wird es übersetzt und es kommen diese Statistiken raus...
1 | # avr-gcc (GCC) 3.4.5 (20060125) |
2 | AVR Memory Usage |
3 | ---------------- |
4 | Device: atmega16 |
5 | |
6 | Program: 224 bytes (1.4% Full) |
7 | (.text + .data + .bootloader) |
8 | |
9 | Data: 0 bytes (0.0% Full) |
10 | (.data + .bss + .noinit) |
1 | # avr-gcc (GCC) 4.1.1 (WinAVR 20070122) |
2 | AVR Memory Usage |
3 | ---------------- |
4 | Device: atmega16 |
5 | |
6 | Program: 212 bytes (1.3% Full) |
7 | (.text + .data + .bootloader) |
8 | |
9 | Data: 0 bytes (0.0% Full) |
10 | (.data + .bss + .noinit) |
Dankeschön, ich habe meinen Fehler mittlerweile auch gefunden, allem anschein nach kann ich dem avrgcc nicht soviel zumuten wie gedacht. Danke nochmal. mfg
Verrätst du den Fehler ? Falls nochmal jemand ein ähnliches Problem hat (bei der Havard-Architektur des AVR nicht unwahrscheinlich) ist das bestimmt hilfreich.
Pkt1: PSTR(...) ist als Typecast definiert, darf aber nicht zur Initialisierung von PROGMEM Elementen verwendet werden.
bonjour Pouvez-vous m'aider? expected initializer before 'PROGMEM'
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.