const pointer, initializer element is not constant

22/01/2012 - 20:43 von Arne Pagel | Report spam
Hallo NG,

ich habe ein kleines C Problem bei der Initialisierung eines Zeigers auf die Adresse eines
Strukturelements mit konstanter Adresse.

Ich habe einen Zeiger, dessen Adresse sich nicht àndert, somit initialisiere ich den Zeiger mit
dieser Adresse:

t_fpga * const g_fpga = (t_fpga *)0xA0000000;

Dieser Zeiger ist vom Typ folgender:

typedef struct
{
u16 ledreg;
u16 ledreg2;
} t_fpga;


In einer anderen C-Datei, die aus einer Autocodegenerierung stammt und deren Inhalt ich nicht àndern
kann, wird mein Zeiger nun Zugewiesen. Ändern kann ich nur den Header dieser Datei:

xxx.h:
extern t_fpga * const g_fpga;
#define FPGA_LED (&g_fpga->ledreg)

xxx.c:
const t_object object_FPGA = {(u8*) FPGA_LED,2};

Der Compiler sagt nun, das an dieser Stelle mein Zeiger (&g_fpga->ledreg) nicht Konstant wàre
(initializer element is not constant), was er in meinem Fall aber ist. Das Internet behauptet nun,
dass das was ich machen möchte in C generell nicht geht. Also Die Adresszuweisung zur
Übersetzungszeit mit anschließender Zuweisung wàhrend der Übersetzung.

Habe ich etwas falsch gemacht und sehe es nicht?
Kann ich durch casten den Compiler davon überzeugen das mein Zeiger doch Konstant ist?

bin für jeden Tipp dankbar,
Arne
 

Lesen sie die antworten

#1 Marcel Müller
22/01/2012 - 21:14 | Warnen spam
Hallo!

On 22.01.12 20.43, Arne Pagel wrote:
Ich habe einen Zeiger, dessen Adresse sich nicht àndert, somit
initialisiere ich den Zeiger mit dieser Adresse:

t_fpga * const g_fpga = (t_fpga *)0xA0000000;


[...]
In einer anderen C-Datei, die aus einer Autocodegenerierung stammt und
deren Inhalt ich nicht àndern kann, wird mein Zeiger nun Zugewiesen.
Ändern kann ich nur den Header dieser Datei:

xxx.h:
extern t_fpga * const g_fpga;
#define FPGA_LED (&g_fpga->ledreg)



Hier ist der erste Knackpunkt. FPGA_LED gibt eine Konstante, aber keine
Compilezeit-Konstante.

xxx.c:
const t_object object_FPGA = {(u8*) FPGA_LED,2};



Und manche Compiler akzeptieren in {...} Initialisierungen nur
Compilezeit-Konstanten. AFAIK ist das auch spezifikationsgemàß.

Der Compiler sagt nun, das an dieser Stelle mein Zeiger
(&g_fpga->ledreg) nicht Konstant wàre (initializer element is not
constant), was er in meinem Fall aber ist. Das Internet behauptet nun,
dass das was ich machen möchte in C generell nicht geht.



So wie es oben steht, akzeptieren es nicht alle Compiler.
Manche aber schon. Evtl. gibt es noch Kommandozeilenschalter für
Compiler-Erweiterungen.

Also Die
Adresszuweisung zur Übersetzungszeit mit anschließender Zuweisung
wàhrend der Übersetzung.



Man müsste schreiben:
const t_object object_FPGA;
object_FPGA.erstesfeld = (u8*) FPGA_LED;
object_FPGA.zweitesfeld = 2;
Dann geht es auch mit nicht-konstante Werten.

Habe ich etwas falsch gemacht und sehe es nicht?



Ja, der Wert von g_fpga steht nicht zur Übersetzungszeit fest.
Jedenfalls nicht zur Übersetzungszeit von allen Module.

Kann ich durch casten den Compiler davon überzeugen das mein Zeiger doch
Konstant ist?



Nein, die Eigenschaft "compile time constant" kann man nicht im
Nachhinein durch casten herbeiführen.

bin für jeden Tipp dankbar,



Du könntest erstens g_fpga durch ein #define ersetzen, das gibt eine
Compilezeit Konstante.

Alternativ könntest Du auch das extern weglassen, und die Definition von
t_fpga * const g_fpga = (t_fpga *)0xA0000000;
in den Header schaffen. const impliziert static und dadurch hat nun jede
Übersetzungseinheit ihre eigene, bekannte Konstante.


Marcel

Ähnliche fragen