Forum: Compiler & IDEs Compiler Warnung


von Volker (Gast)


Lesenswert?

Hallo,

ich habe im Flash ein Array angelegt

char device_s [] PROGMEM = "**Blabla**      ";

Um Zeichen auf einem Display auzugeben habe ich folgende Funktion:

void displayausg (char *txt,byte dispadr,byte length, byte from_flash)
{

   byte i;
   command2lcd (dispadr);
   for (i=0;i<length;i++)
   {

     if (from_flash)
      {
      data2lcd (pgm_read_byte(txt));
      }
     else
      {
       data2lcd (*txt);
       txt++;
      }
   }
}

Da ich dieser Funktion auch Texte übergebe, die nicht im Flash liegen,
mache ich die Unterscheidung durch die Übergabe "from_flash"

Wenn ich nun die Funktion aufrufe

displayausg ( device_s,0x80,16,1 );

erhalte ich die Warnung:
Warnung: Verarbeiten des Argumentes 1 von »displayausg« streicht
Qualifizierer von Zeiger-Zieltypen.

Dazu folgende Fragen
1. Will mir der Compiler damit sagen, dass ich dafür sorgen muß, in
welcher Speicherklasse der Zieltyp steht (Was ich ja auch mache)?

2. Wie kann ich die Warnung abstellen?

Mit einem Cast geht es, weiss aber nicht wieso.
displayausg ((char*) device_s,0x80,16,1 );

Viele Grüße

Volker

von Rolf Magnus (Gast)


Lesenswert?

> Dazu folgende Fragen
> 1. Will mir der Compiler damit sagen, dass ich dafür sorgen muß,
> in welcher Speicherklasse der Zieltyp steht (Was ich ja auch
> mache)?

Nein. Er will dir sagen, daß du einen Zeiger auf const char an eine
Funktion übergibst, die einen Zeiger auf char erwartet und somit wird
dabei das const unter den Tisch gekehrt.

> 2. Wie kann ich die Warnung abstellen?

const char* als Typ für den ersten Parameter wählen.

> Mit einem Cast geht es, weiss aber nicht wieso.
> displayausg ((char*) device_s,0x80,16,1 );

Weil du damit dem Compiler explizit sagst, daß du das const wegwerfen
willst. Ohne den Cast geht er von einem Versehen aus und warnt deshalb.

von Volker (Gast)


Lesenswert?

Danke Rolf

Volker

von Stefan K. (_sk_)


Lesenswert?

if (from_flash)
      {
      data2lcd (pgm_read_byte(txt));
      }
     else
      {
       data2lcd (*txt);
       txt++;
      }

Etwas offtopic:

txt++ wird nur ausgeführt, wenn nicht aus dem Flash gelesen wird.
Entweder txt++ auch im ersten if-Teil einfügen oder die Klammerung
verschieben.

Gruß, Stefan

von Volker (Gast)


Lesenswert?

@Stefan,

habe ich bereits gemerkt, nachdem auf dem Display immer nur der
erste Buchstaben des Strings über die gesamte Länge geschrieben wurde.

Dennoch danke für deine Aufmerksamkeit.

Volker

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.