Forum: Compiler & IDEs ... "discards qualifiers from pointer target type"


von miwitt001 (Gast)


Lesenswert?

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

von Joerg Wunsch (Gast)


Lesenswert?

const oder volatile ignoriert.

von miwitt001 (Gast)


Lesenswert?

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

von Joerg Wunsch (Gast)


Lesenswert?

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 );

von miwitt001 (Gast)


Lesenswert?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.