... "discards qualifiers from pointer target type"

Gast #74770
Hallo!
Ich bin grade dabei einen ATMega8 mit dem AVR-GCC Compiler zu
programmieren. Allerdings spuckt der Compiler immer folgende Warnungen
aus:
"warning: passing arg 1 of `uartReceiveByte' discards qualifiers from
pointer target type"
Ich will der Funktion einfach die Adresse einer Variablen übergeben.
Der Code dazu sieht so aus:
"uartReceiveByte( &g_rs485data.buffer[g_rs485data.bufferlength] )".
Weiß einer was das bedeuted, wie man das weg bekommt bzw ob man das
ignorieren darf. Ich hab dazu nix brauchbares gefunden.
Vielen Dank schonmal
mfg Michael
Gast
Danke. Ich habe jetzt alle Betreffenden Variablen mit volatile
gekennzeichnet. Hilft aber leider nichts. Das ganze sieht jetzt so aus
(das is alles global)
typedef struct
{
  volatile uint8_t    adress;
  volatile uint16_t    bytes;
  volatile uint8_t  *  data;
  volatile uint8_t    isvalid;
  volatile uint16_t    connected;
  volatile uint8_t    lastSent;
  volatile uint8_t    buffer[MAX_PACKET_SIZE];
  volatile uint8_t    bufferlength;
}rs485data;
volatile rs485data g_rs485data;
Der Aufruf der Funktion sieht so aus:
uartReceiveByte( &g_rs485data.buffer[g_rs485data.bufferlength] );

Was bedeuted das eigentlich genau?? Wenn das nicht zu Fehlern führt
dann ignorier ichs einfach, weil die Warnungen irgendwann eh
verschwinden.
mfg Michael
Gast
Ich habe ja nicht geschrieben, daß Du alles "volatile" deklarieren
sollst. ;-)  Das sollte man sowieso nicht blindlings machen, da es
wirklich jede Optimierung auf den so gekennzeichneten Variablen
verhindert.  Ist das wirklich, was Du willst?

Aber ohne auch den Prototypen für uartReceiveByte() zu sehen, kann
man den Fehler nicht nachvollziehen.

Nun, es bedeutet genau das, was da steht: daß Du zwischen zwei
Zeigern mit verschiedenen `qualifiers' hin- und hertransferierst,
die bis auf den qualifier ansonsten zueinander passen.  Qualifier
sind eben const, volatile bzw. neuerdings (C99) auch restricted,
von letzterem wird aber in der avr-libc noch kein Gebrauch gemacht
(und Du wirst es vermutlich auch nicht selbst benutzen ;-).

Übrigens.

uartReceiveByte( &g_rs485data.buffer[g_rs485data.bufferlength] );

==

uartReceiveByte( g_rs485data.buffer + g_rs485data.bufferlength );
Gast
Ah ok danke. Jetzt weiß ich wenigstens was das bedeuted, konnte mit dem
Wort qualifier nämlich nix anfangen. Ich denke mal jetzt find ich den
Fehler selber, weiß ja wonach ich suchen muss. Danke für deinen Tipp am
Ende noch, aber das hab ich auch schon ausprobiert aus lauter
Verzweifelung :-)
mfg Michael

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 23 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.