mikrocontroller.net

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


Autor: Kai Hofmann (avrickeler)
Datum:

Bewertung
0 lesenswert
nicht 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:
//defines fürs 16er-array
#define PAR16_TXPDO1_MAP_ENTRIES   7
//weitere defines

//Anzahl der Parameter im 16-er Bereich
#define PARAMCOUNT16               20

//defines fürs 32er-array
#define PAR32_TXPDO1_MAP0          1
//weitere defines

//Anzahl der Parameter im 32-er Bereich
#define PARAMCOUNT32               10
//
#define PARAMCOUNT_TOTAL    PARAMCOUNT16+(2*PARAMCOUNT32)
//
s16  Param16[PARAMCOUNT_TOTAL];
//
//Hier der 'sogenannte' konstante Pointer an die genannte Position im Param16-Array
u32* const Param32=(u32* const) (&Param16[PARAMCOUNT16]);

//
#define ODEntry(Index, Subindex, Attribute, Mapping, Variable)\
  {Index, Subindex, Attribute, Mapping, sizeof(Variable), (void*)&Variable} 
//
//nun soll folgendes Array initialisiert werden

tsODEntry OD[] = {  
  //hier kommen mehrere Einträge ...
  //
  //so....dieser funktioniert noch:
  ODEntry(0x1A00, 0x00, RW, MAP_N, Param16[PAR16_TXPDO1_MAP_ENTRIES]),
  //-------------------------
  //dieser mit Param32 erzeugt den not-constant Fehler:
  ODEntry(0x1A00, 0x01, RW, MAP_N, Param32[PAR32_TXPDO1_MAP0]),
  //-------------------------
  {0,0,EOF,0,0},  // end of OD
}
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

Autor: OliverSo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi, Oliver,

woher stammt das Zitat?

Gruss
Michael

Autor: OliverSo (Gast)
Datum:

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

Oliver

Autor: Kai Hofmann (avrickeler)
Datum:

Bewertung
0 lesenswert
nicht 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:
#define ODEntryL32(Index, Subindex, Attribute, Mapping, Variable)\
  {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:
  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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.