Použití printf a proměnná size_t

Pali

Použití printf a proměnná size_t
« kdy: 16. 06. 2011, 15:12:00 »
Ahojte, aky je standartny sposob, resp. aka konstrukcia sa ma pouzit ak chcem pomocou printf vypisat hodnotu premennej typu size_t (tak aby to bolo platformovo nezavisle)? size_t moze byt na 32 a 64 bit. systemoch roznej velkosti.
« Poslední změna: 16. 06. 2011, 15:37:15 od Petr Krčmář »


zdfvsddf

Re: printf a size_t
« Odpověď #1 kdy: 16. 06. 2011, 15:25:47 »
ja bych pouzil %d.

dicolaz

Re: printf a size_t
« Odpověď #2 kdy: 16. 06. 2011, 15:28:37 »
%zd

Pali

Re: printf a size_t
« Odpověď #3 kdy: 16. 06. 2011, 15:38:07 »
%d je urcite nespravne (size_t moze byt kludne aj long int)
%zd vyzera rozumne (aspon co som teraz nasiel)

aky je rozdiel medzi %zd a %zu ?

dicolaz

Re: Použití printf a proměnná size_t
« Odpověď #4 kdy: 16. 06. 2011, 15:44:14 »
d - signed int --- %zd pre ssize_t
u - unsigned int --- %zu pre size_t



Pali

Re: Použití printf a proměnná size_t
« Odpověď #5 kdy: 16. 06. 2011, 15:54:33 »
Dik,
takze potom spravne ma byt:
%zu

dicolaz

Re: Použití printf a proměnná size_t
« Odpověď #6 kdy: 16. 06. 2011, 15:59:52 »
ano ... zavisi ci je to typu size_t alebo ssize_t (hodnotu typu ssize_t vracia napr. read(2), write(2))

pre size_t pouzite %zu
a pre ssize_t pouzite %zd

szt

Re: Použití printf a proměnná size_t
« Odpověď #7 kdy: 17. 06. 2011, 12:57:17 »
$ cc -Wall -pedantic -ansi a.c
a.c: In function 'main':
a.c:8: warning: ISO C90 does not support the 'z' printf length modifier

Zaroven je dobre mit na pameti, ze int64_t je nekde definovany jako long, a nekde jako long long. Nicmene minimalne debiani gcc + gnu libc to jaksi ignoruje a vypisuje nesmyslne warningy. Potom mate na vyber mezi takovymto kodem:

#if LONG_MAX == LLONG_MAX && defined(__linux__)
                            "%ld",
#else
                            "%lld",
#endif

a nebo pouzitim prasaren typu PRId64, ktere samozrejme nejsou rozsirene ani pekne.

Uzijte si to :-)

dicolaz

Re: Použití printf a proměnná size_t
« Odpověď #8 kdy: 17. 06. 2011, 22:03:46 »
Citace: szt
$ cc -Wall -pedantic -ansi a.c
a.c: In function 'main':
a.c:8: warning: ISO C90 does not support the 'z' printf length modifier

no ano ... "-ansi" tak trochu redukuje "pohodlne programovanie" :)

Citace: szt
Zaroven je dobre mit na pameti, ze int64_t je nekde definovany jako long, a nekde jako long long. Nicmene minimalne debiani gcc + gnu libc to jaksi ignoruje a vypisuje nesmyslne warningy. Potom mate na vyber mezi takovymto kodem:

#if LONG_MAX == LLONG_MAX && defined(__linux__)
                            "%ld",
#else
                            "%lld",
#endif

a nebo pouzitim prasaren typu PRId64, ktere samozrejme nejsou rozsirene ani pekne.

Uzijte si to :-)

no pouzitie %z by prave malo riesit to ako je int64_t definovany ...

turista

Re: Použití printf a proměnná size_t
« Odpověď #9 kdy: 17. 06. 2011, 23:08:46 »
prirad si to do unsigned long a vypis pres %lu

Ales Hakl

Re: Použití printf a proměnná size_t
« Odpověď #10 kdy: 26. 06. 2011, 01:56:14 »
Pokud cloveku jde o to striktni ISO C, tak bych pouzil makro PRIiPTR z <inttypes.h>. Ktere se rozvyne na sekvenci znaku za % pro tisk uintptr_t pricemz je asi rozumne predpokladat, ze bezne nenarazite na platformu kde uintptr_t a size_t jsou ruzne typy a zaroven ja pro ni k dispozici kompilator ISO C.