Warnung beim kompilieren

Gast #412145
Lesenswert?

Hallo,

ich hab zuerst WinAVR 20040720 mit avr-gcc 3.4.1 benutzt, dann auf
WinAVR 20060421 mit avr-gcc 3.4.6 aktualisiert und mein derzeitiges
Projekt soweit modifziert, dass es sich fehler- und warnungsfrei
kompilieren lässt.

Neulich habe ich dann man avr-gcc 4.1.1 eingespielt und bekomme bei der
Übersetzung meines Programms mehrere der folgenden Warnung:

"pointer targets in passing argument 2 of 'ltoa' differ in
signedness"

Der dazugehörige Programmteil sieht so aus :
1
#include <stdlib.h>
2

3
void DisplayFrequency(unsigned long freq)
4
{
5
   unsigned char Buffer[7] = " 00.00\0";
6
   
7
   // ...
8
  
9
   ltoa(freq, &Buffer[0], 10);
10

11
   // ...
12
}

Ich habe noch nachgesehen, an der Definition von ltoa scheint sich
nichts geändert zu haben. Ich hoffe es kann mir jemand helfen.
#412146
Lesenswert?

hallo,
ich vermute, der compiler ist so "schlau" , das er

&Buffer[0]

gleich als

Buffer

nimmt, wie's imo auch geschrieben werden sollte: "Der Name eines
Arrays ist ein Zeiger auf das erste Element" .
Dies ist dann ein pointer auf unsigned char ist, wohingegen ltoa einen
signed char bevorzugt.

bye kosmo
Moderator Persönliche Seite #412149
Lesenswert?

char ist zwar immer als entweder signed char oder unsigned char
implementiert (beim GCC kann man die Vorzugsimplementierung
zwischen beiden auch wechseln), man sollte es aber immer als einen
von beiden Varianten verschiedenen Typ behandeln, andernfalls ist
das Programm nicht mehr portabel.

Grundsatz: "char" für alles, was darstellbare Zeichen sind, mit
denen aber nicht gerechnet wird.  "unsigned char" bzw. "signed
char" überall dort, wo man es als kleinen Integer benutzt (oder
besser gleich int8_t oder uint8_t aus <stdint.h>, aber das ist
ein C99-Feature).

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