• Das kreative Thema des Monats Oktober wird vor allem diejenigen unter Euch besonders ansprechen, denen Do-it-yourself quasi im Blut liegt. Zeigt uns Eure Improvisationskünste oder fotografiert, was andere Leute sich so im Alltag zusammengestrickt haben. --> Zum Mitmachen bitte hier klicken

[C] %d macht Probleme

Lukimoe

Fuji
Registriert
20.07.08
Beiträge
36
Hi,
in meinem Buch stehen ein paar Beispielprogramme die innerhalb von printf %d benutzen, z.B.:

Code:
        printf("\nEin char		belegt %d Bytes", sizeof( char ));
	printf("\nEin int		belegt %d Bytes", sizeof( int ));
	printf("\nEin short		belegt %d Bytes", sizeof( short ));
	printf("\nEin long		belegt %d Bytes", sizeof( long ));
	printf("\nEin unsigned char		belegt %d Bytes", sizeof( unsigned char ));
	printf("\nEin unsigned int		belegt %d Bytes", sizeof( unsigned int ));
	printf("\nEin unsigned short	belegt %d Bytes", sizeof( unsigned short ));
	printf("\nEin unsigned long		belegt %d Bytes", sizeof( unsigned long ));
	printf("\nEin float		belegt %d Bytes", sizeof( float ));
	printf("\nEin double	belegt %d Bytes", sizeof( double ));

Ich kriege aber beim Kompilieren immer diese Meldung:
Code:
warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘long unsigned int’

Leider steht in den ersten Kapiteln noch nichts über die Verwendung von %d,
ich kanns mir natürlich erschließen aber Bescheid weiß ich nicht...
Ist das irgendwas Mac-spezifisches oder ist da generell der Wurm drin?

Ausführen kann ich das Programm schon, aber das mit den Warnungen sollte ja eher nicht sein...

Danke schonmal,
Lukas
 
Mir fallen spontan drei Möglichkeiten ein.

Format: Verwende %ld anstatt %d
Casting: Verwende (int)sizeof(char)
Für Faule: Compiler "clang llvm" benutzen
 
Mac-typisch? Weiß nicht. Der Code ist einfach unsauber.

%d nimmt einen int.

Du verwendest sizeof(). sizeof() als liefert als Typ size_t. Das ist ein vorzeichenloser Integer. Nun kann aber der Integer eine andere Größe haben als int, insbesondere dann, wenn etwa int 32 Bit hat, das System aber größere Typen verarbeiten kann, explizit weil es im 64-Bit-Modell läuft. Dann ist size_t ein 64-Bit-Typ.

Da auf Macs ILP32/LP64 verwendet wird, entspricht size_t einem long.

Leider kennt printf() et al. keinen Format-Specifier für size_t. %p würde allerdings immer passen. Da bekommst du aber eine hexadezimale Ausgabe.
 
Okay, dann liegt das wohl auch daran, dass im Buch noch von 16bit Systemen die Rede ist *g*
Aber jetzt weiß ich ja, wie ichs anpassen muss...

Danke :)