• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> Klick

[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
 

Pii

Rheinischer Krummstiel
Registriert
25.06.07
Beiträge
383
Mir fallen spontan drei Möglichkeiten ein.

Format: Verwende %ld anstatt %d
Casting: Verwende (int)sizeof(char)
Für Faule: Compiler "clang llvm" benutzen
 

Amin Negm-Awad

Süsser Pfaffenapfel
Registriert
01.03.07
Beiträge
665
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.
 

Lukimoe

Fuji
Registriert
20.07.08
Beiträge
36
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 :)