www.mikrocontroller.net

Forum: Compiler & IDEs Bug in Doku zu avr-libc?


Autor: AndyP (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

in der Doku zur avr-libc, im Kapitel "Data in Program Space", Abschnitt 
"Storing and Retrieving Strings in the Program Space" scheint ein Fehler 
zu stecken:

...

    for (unsigned char i = 0; i < 5; i++)
    {
        // falsch
        strcpy_P(buffer, pgm_read_word(&(string_table[i])));

        // richtig
        strcpy_P(buffer, (PGM_P) pgm_read_word (string_table+i));

        // Display buffer on LCD.
    }
    return;

...

Die mit //falsch markierte Zeile führt zu folgender Fehlermeldung beim 
Compilieren:

test0.c:26: warning: passing argument 2 of 'strcpy_P' makes pointer from 
integer without a cast

Gruss,
AndyP.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
AndyP wrote:

>         // falsch
>         strcpy_P(buffer, pgm_read_word(&(string_table[i])));
>
>         // richtig
>         strcpy_P(buffer, (PGM_P) pgm_read_word (string_table+i));

Außer, dass du neben dem Bugfix noch den Stil geändert hast.  Der
reine Bugfix wäre
strcpy_P(buffer, (PGM_P)pgm_read_word(&(string_table[i])));

wobei ich das zusätzliche Klammerpaar reichlich unsinnig finde
und eigentlich eher ein Freund deines Stils bin mit dem +i --
aber wer die Pointerarithmetik noch nicht recht verstanden hat,
findet die Bildung der Adresse des n-ten Elements offenbar
einleuchtender.

Schreib' 'nen Bugreport bitte.

Autor: AndyP (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Jörg,

unter http://savannah.nongnu.org/bugs/index.php, Bug-ID: 21183 gemeldet.

Gruss,
AP.

Autor: Andreas Schoelver (bitswapper)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo AndyP

Zur Ehrenrettung der Doku-Schreiber sei erwähnt, dass es sich nicht um
einen Fehler, sondern nur um eine Warnung handelt.
Im Zusammenhang mit der Programmiersprache wird (leider) immer mal
wieder auf die explizite Typkonvertierung verzichtet.

Das ist eben eine der Schwächen von C.

Das Ergebnis ist in diesem Fall auch ohne cast korrekt,
da auch eine Adresse nur ein Zahlenwert ist.

Wenn Du selbst 'string_table+i' verwendest, weil Du die technischen
Hintergründe kennst, sollte Dich ein fehlendes (PGM_P) theoretisch
eher nicht stören.

(Ich selbst bin allerdings auch eher bestrebt, alle Warnungen zu
eliminieren.)

Apropos 'string_table+i': die Formulierung setzt Kontextwissen voraus,
das im Fall '&(string_table[i]))' nicht notwendig ist.

Gruß
Andreas

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.