Portál AbcLinuxu, 24. dubna 2024 04:25


Dotaz: Převod off64_t na řetězec

Jardík avatar 14.4.2006 22:04 Jardík | skóre: 40 | blog: jarda_bloguje
Převod off64_t na řetězec
Přečteno: 239×
Odpovědět | Admin
Chvilku jsem googlil, ale nikde jsem nenašel, jak převést na řetězec neznaménkové 64bit číslo jako je např. off64_t. Zkoušel jsem to pomocí sprintf, ale bezúspěšně.
Věřím v jednoho Boha.
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

Luboš Doležel (Doli) avatar 14.4.2006 22:07 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
Rozbalit Rozbalit vše Re: Převod off64_t na řetězec
Odpovědět | | Sbalit | Link | Blokovat | Admin
sprintf, %llu
Jardík avatar 14.4.2006 22:26 Jardík | skóre: 40 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: Převod off64_t na řetězec
Bohužel to nefunguje:
off64_t cislo = 1024*1024*1024*6;
char buffer[500];
sprintf( buffer, "%llu", cislo );
Ukáže to 2147483648, což není správně.
Věřím v jednoho Boha.
Luboš Doležel (Doli) avatar 14.4.2006 22:35 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
Rozbalit Rozbalit vše Re: Převod off64_t na řetězec
Takhle to dělat nemůžete:
test.c:10: warning: integer overflow in expression
test.c:10: warning: overflow in implicit constant conversion
Musíte alespoň za jedno číslo přidat ULL.
$ ./test
6442450944
Jardík avatar 14.4.2006 22:39 Jardík | skóre: 40 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: Převod off64_t na řetězec
I když dám ULL za všechny, tak to hodí stejně stejný výsledek. Nemůže to dělat kompilátor (MinGW)?
Věřím v jednoho Boha.
14.4.2006 22:37 #Tom | skóre: 32 | blog: Inspirace, aneb co jsem kde vyhrabal
Rozbalit Rozbalit vše Re: Převod off64_t na řetězec
Co tohle?
sprintf(buffer, "%.0lf", (double) cislo);
Jardík avatar 14.4.2006 22:44 Jardík | skóre: 40 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: Převod off64_t na řetězec
Tohle funguje (s tím ULL), ale není double znaménkový? Co když budu mít číslo 2^64?
Věřím v jednoho Boha.
14.4.2006 22:46 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: Převod off64_t na řetězec
Typ off_t je z podstaty věci také znaménkový.
14.4.2006 22:46 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: Převod off64_t na řetězec
A off64_t samozřejmě také.
Jardík avatar 14.4.2006 22:59 Jardík | skóre: 40 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: Převod off64_t na řetězec
Teď jsem se kouknul do sys/types.h a on je opravdu znaménkový. Takže se omlouvám za nesprávný výrok. Tím se ale také vše mění. Takže co teď předat funkci sprintf místo %llu a co psát za čísla místo ULL aby nedošlo k přetečení?
Věřím v jednoho Boha.
Luboš Doležel (Doli) avatar 14.4.2006 23:46 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
Rozbalit Rozbalit vše Re: Převod off64_t na řetězec
%lld a LL
Jardík avatar 14.4.2006 23:58 Jardík | skóre: 40 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: Převod off64_t na řetězec
off64_t cislo = 1024*1024*1024*6;
char buffer[500];
sprintf( buffer, "%lld", cislo );
=-2147483648 = Špatně
off64_t cislo = 1024LL*1024LL*1024LL*6LL;
char buffer[500];
sprintf( buffer, "%lld", cislo );
=-2147483648 = Špatně
off64_t cislo = 1024*1024*1024*6;
char buffer[500];
sprintf( buffer, "%.0lf", (double)cislo );
=-2147483648 = Špatně
off64_t cislo = 1024LL*1024LL*1024LL*6LL;
char buffer[500];
sprintf( buffer, "%.0lf", (double)cislo );
=6442450944 = OK
Zřejmě mi nic jiného nezbude a budu muset použít to přetypování. Zajímavé ale je, že tobě to funguje. Asi ten MinGW má fci sprintf nějakou divnou :-(.
Věřím v jednoho Boha.
15.4.2006 00:38 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: Převod off64_t na řetězec
Proč se bráníte použít odpovídající makro 'PRId64', jak jsem vám poradil dříve?
Jardík avatar 15.4.2006 11:57 Jardík | skóre: 40 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: Převod off64_t na řetězec
Když jsem napsal sprintf( buffer, PRId64, cislo );, tak mi to ukázalo chybu, že proměnná není definována. Pak jsem se kouknul do toho hlavičkového souboru a zjistil, že musím před hlavičkový soubor připsat #define __STDC_FORMAT_MACROS. Poté se ale do bufferu dal řetězec "I64d". Pak jsem vyzkoušel sprintf( buffer, "%I64d", cislo); a ono to funguje :-). Díky moc za nakopnutí správným směrem.
Věřím v jednoho Boha.
Jardík avatar 15.4.2006 12:01 Jardík | skóre: 40 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: Převod off64_t na řetězec
Hmm. Z hlavičkového souboru inttypes.h:
/* 7.8.1 Macros for format specifiers
 * 
 * MS runtime does not yet understand C9x standard "ll"
 * length specifier. It appears to treat "ll" as "l".
 * The non-standard I64 length specifier causes warning in GCC,
 * but understood by MS runtime functions.
 */
A pak mi nemá fungovat %lld a %llu.
Věřím v jednoho Boha.
14.4.2006 22:45 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: Převod off64_t na řetězec
Tak zkuste použít standardní hlavičkové soubory:
  #include <inttypes.h>

  ...
  
  printf(PRId64, cislo);

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.