Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: Pali 16. 06. 2011, 15:12:00

Název: Použití printf a proměnná size_t
Přispěvatel: Pali 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.
Název: Re: printf a size_t
Přispěvatel: zdfvsddf 16. 06. 2011, 15:25:47
ja bych pouzil %d.
Název: Re: printf a size_t
Přispěvatel: dicolaz 16. 06. 2011, 15:28:37
%zd
Název: Re: printf a size_t
Přispěvatel: Pali 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 ?
Název: Re: Použití printf a proměnná size_t
Přispěvatel: dicolaz 16. 06. 2011, 15:44:14
d - signed int --- %zd pre ssize_t
u - unsigned int --- %zu pre size_t

Název: Re: Použití printf a proměnná size_t
Přispěvatel: Pali 16. 06. 2011, 15:54:33
Dik,
takze potom spravne ma byt:
%zu
Název: Re: Použití printf a proměnná size_t
Přispěvatel: dicolaz 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
Název: Re: Použití printf a proměnná size_t
Přispěvatel: szt 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 :-)
Název: Re: Použití printf a proměnná size_t
Přispěvatel: dicolaz 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 ...
Název: Re: Použití printf a proměnná size_t
Přispěvatel: turista 17. 06. 2011, 23:08:46
prirad si to do unsigned long a vypis pres %lu
Název: Re: Použití printf a proměnná size_t
Přispěvatel: Ales Hakl 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.