Forum: Compiler & IDEs Konstanter Pointer zu einer Array-Position (Gcc,WinAVR)


von Kai H. (avrickeler)


Lesenswert?

Hallo Leute,

ich würde gern mit dem folgenden (Pseudo-)Code 32-Bit Variablen in ein 
16-Bit Array schreiben (und auslesen), bekomme aber den Fehler:

"error: initializer element is not constant",

Also:
1
//defines fürs 16er-array
2
#define PAR16_TXPDO1_MAP_ENTRIES   7
3
//weitere defines
4
5
//Anzahl der Parameter im 16-er Bereich
6
#define PARAMCOUNT16               20
7
8
//defines fürs 32er-array
9
#define PAR32_TXPDO1_MAP0          1
10
//weitere defines
11
12
//Anzahl der Parameter im 32-er Bereich
13
#define PARAMCOUNT32               10
14
//
15
#define PARAMCOUNT_TOTAL    PARAMCOUNT16+(2*PARAMCOUNT32)
16
//
17
s16  Param16[PARAMCOUNT_TOTAL];
18
//
19
//Hier der 'sogenannte' konstante Pointer an die genannte Position im Param16-Array
20
u32* const Param32=(u32* const) (&Param16[PARAMCOUNT16]);
21
22
//
23
#define ODEntry(Index, Subindex, Attribute, Mapping, Variable)\
24
  {Index, Subindex, Attribute, Mapping, sizeof(Variable), (void*)&Variable} 
25
//
26
//nun soll folgendes Array initialisiert werden
27
28
tsODEntry OD[] = {  
29
  //hier kommen mehrere Einträge ...
30
  //
31
  //so....dieser funktioniert noch:
32
  ODEntry(0x1A00, 0x00, RW, MAP_N, Param16[PAR16_TXPDO1_MAP_ENTRIES]),
33
  //-------------------------
34
  //dieser mit Param32 erzeugt den not-constant Fehler:
35
  ODEntry(0x1A00, 0x01, RW, MAP_N, Param32[PAR32_TXPDO1_MAP0]),
36
  //-------------------------
37
  {0,0,EOF,0,0},  // end of OD
38
}
error: initializer element is not constant
beim Param32

Mir ist nicht klar, warum mein Pointer nicht einer festen Addresse 
zugeordnet werden kann.
Muß da noch irgendwo was rein, oder geht das mit gcc gar nicht?

GCC: 4.1.2 (switch -os), WinAVR, Target: Atmel AT90CAN128

Danke für Eure Antworten schonmal im Voraus. Ich hoffe dass meine 
Begrifflichkeiten allgemein verständlich sind (ich lass mich auch gerne 
verbessern) ;-)

Kai

von OliverSo (Gast)


Lesenswert?

>The value of any object, even if it is a
>const qualified object, is not a constant expression in C.

So ist das halt in C. In C++ geht sowas.

Oliver

von Michael (Gast)


Lesenswert?

Hi, Oliver,

woher stammt das Zitat?

Gruss
Michael

von OliverSo (Gast)


Lesenswert?

Aus einer der unzähligen Diskussionen zur Fehlermeldung
>error: initializer element is not constant
http://www.thescripts.com/forum/thread553555.html

Oliver

von Kai H. (avrickeler)


Lesenswert?

Hallo,

da diese Angelegenheit in C nicht funktionieren wird (s.o.), habe ich 
das Problem jetzt folgendermaßen umgangen:

1.) neues, zusätzliches define angelegt:
1
#define ODEntryL32(Index, Subindex, Attribute, Mapping, Variable)\
2
  {Index, Subindex, Attribute, Mapping, sizeof(u32), (void*)(&Param16[PARAMCOUNT16+(2*Variable)])}

2.) dann kann ich einfach die vorherige Zeile
  ODEntry(0x1A00, 0x01, RW, MAP_N, Param32[PAR32_TXPDO1_MAP0])
in dies hier ändern:
1
  ODEntryL32(0x1A00, 0x01, RW, MAP_N, PAR32_TXPDO1_MAP0)

...ich find', es sieht im Quellcode unter den anderen Zeilen echt 
beschissen aus, funktionert aber!
Zusätzlich kann ich dann den Pointer Param32 im Programm wie ein Array 
benutzen. Naja, is ja eigentlich nun so, wie ich es wollte.

Danke nochmal an Euch

Kai

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.