PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : warning: assignment discards qualifiers from pointer...



PCMan
11.12.2008, 11:31
Hallo Leute,
ich hab da ein Problem mit einem void pointer.
Ich habe ein globales Struct Element. Darin befindet sich ein void Pointer.
Dann gibt es ein zweites globales Struct Element, in dem sich mehrere uint16_t Variablen befinden.
Ich möchte nun während der Laufzeit dem Pointer verschiedene Adressen geben, und zwar die adressen der verschiedenen uint16_t Variablen.
Das funktioniert auch bisher. Ich bekomme allerdings immer die Warnung vom Compiler:


warning: assignment discards qualifiers from pointer target type


Hier vereinfachter Code:





volatile struct
{
void *pvar;
} nav;

volatile struct
{
uint16_t a;
} system;

....

void func()
{
nav.pvar = &system.a; //erzeugt die Warnung
*(uint16_t*) nav.pvar ++; //normale dereferenzierung nach pointer type cast
return;
}


Ich dachte ich müsste bei der Adresszuweisung evtl ebenfalls einen Pointer-Cast ((uint16_t *)nav.pvar = &system.a;) machen, aber das führt dann zu einem error:


error: invalid lvalue in assignment


Ich würde die Warnings gerne wegbekommen, da sie mit sicherheit zu irgendeinem unerklärlichen Verhalten in der Laufzeit führen.
Habt ihr 'ne Idee, was ich da falsch mache?
Viele Grüße,
Simon

cipher
11.12.2008, 12:10
Hi!

Du versuchst den Typ von nav.pvar zu casten. Das liefert den Fehler. Cast &system.a auf den void-Pointer, also:


nav.pvar = (void *) (&system.a);

Ich hab's nicht ausprobiert ob's geht, aber auf den ersten Blick sollte es so passen.


Gruß,

Markus

SprinterSB
11.12.2008, 12:44
Der ursprünglicher Zeiger hatte als Ziel ein volatile Objekt. "volatile" ist der fehlende Qualifier, der angemeckert wird.

Bei Zugriffen via pvar wird gcc also nicht mehr davon ausgehen, daß sich der Zielinhalt "plötzlich" ändern kann.

Die Warnung kann vermieden werden über


volatile struct
{
void volatile * pvar;
} nav;


oder über den obigen Cast. Beide Ansätze liefern aber nicht das gleiche (überleg dir, was der Unterschied ist ;-))