mikrocontroller.net

Forum: Compiler & IDEs Compiler Warnung


Autor: Volker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Volker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Rolf

Volker

Autor: Stefan Kleinwort (_sk_)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Volker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.