-
        

Ergebnis 1 bis 3 von 3

Thema: warning: assignment discards qualifiers from pointer...

  1. #1
    Erfahrener Benutzer Begeisterter Techniker Avatar von PCMan
    Registriert seit
    05.08.2006
    Ort
    Munich
    Beiträge
    311

    warning: assignment discards qualifiers from pointer...

    Anzeige

    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:



    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

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    21.07.2008
    Ort
    Moosburg
    Alter
    39
    Beiträge
    49
    Hi!

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

    Code:
    nav.pvar = (void *) (&system.a);
    Ich hab's nicht ausprobiert ob's geht, aber auf den ersten Blick sollte es so passen.


    Gruß,

    Markus

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    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

    Code:
    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 )
    Disclaimer: none. Sue me.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •