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


von AndyP (Gast)


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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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
1
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.

von AndyP (Gast)


Lesenswert?

Hallo Jörg,

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

Gruss,
AP.

von Andreas S. (bitswapper)


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

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.