Konstanter Pointer zu einer Array-Position (Gcc,WinAVR)

OP #802369
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
OP #803641
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.