Forum: Compiler & IDEs Warnung beim kompilieren


von Tobias (Gast)


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.

von Joe D. (kosmonaut_pirx)


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

von Rolf Magnus (Gast)


Lesenswert?

@Tobias:

Aus welchem Grund benutzt du unsigned char? Der Typ für Zeichen ist
char. Daher kommt auch die Warnung.

von Tobias (Gast)


Lesenswert?

Bingo, das war's!

Ich bin so an Imagecraft ICCAVR gewöhnt, denn dort ist "char"
äquivalent mit "unsigned char".

Ok danke, alles klar!

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


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

von Tobias (Gast)


Lesenswert?

Danke für die Infos, Jörg!

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.