Forum: Compiler & IDEs expected initializer before progmem - Problem


von Alex (Gast)


Angehängte Dateien:

Lesenswert?

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

von Joerg X. (Gast)


Lesenswert?

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

von Alex (Gast)


Lesenswert?

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

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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)

  

von Alex (Gast)


Lesenswert?

Dankeschön,

ich habe meinen Fehler mittlerweile auch gefunden, allem anschein nach 
kann ich dem avrgcc nicht soviel zumuten wie gedacht.

Danke nochmal.

mfg

von Joerg X. (Gast)


Lesenswert?

Verrätst du den Fehler ?
Falls nochmal jemand ein ähnliches Problem hat (bei der 
Havard-Architektur des AVR nicht unwahrscheinlich) ist das bestimmt 
hilfreich.

von Alex (Gast)


Lesenswert?

Pkt1:

PSTR(...) ist als Typecast definiert, darf aber nicht zur 
Initialisierung von PROGMEM Elementen verwendet werden.

von Joerg X. (Gast)


Lesenswert?

Aha, danke!

von Vincent GROSS (Gast)


Angehängte Dateien:

Lesenswert?

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
Noch kein Account? Hier anmelden.