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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.