Bug in Doku zu avr-libc?

Gast #664904
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.
Moderator Persönliche Seite #664909
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.
#680283
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren