expected initializer before progmem - Problem

Gast #559758
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
Angehängte Dateien:
Gast #559773
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
Gast #559793
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
Persönliche Seite #559976
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)

  

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren