| | |
| Stránka: 1 z 1
| [ Príspevkov: 10 ] | |
Autor | Správa |
---|
Registrovaný: 17.07.08 Prihlásený: 24.01.13 Príspevky: 143 Témy: 37 | Napísal tomxi: 12.10.2011 14:22 | |
|
Zdravim,
mam usek kodu kde nacitavam cez getchar nejake cele čislo, problem je, ze mi nefunguje porovnanie či nie je to čislo vacsie ako ULONG_MAX.
Kód: unsigned long int cislo = 0; while (true) { char c = getchar();
if (c == '\n' || c == EOF) break;
if (((cislo * 10 + c - '0') + ULONG_MAX) > ULONG_MAX) { . . . }
cislo = cislo * 10 + c - '0'; }
tento kod som skusal na zaklade doporučenia na nejakej nemeckej stranke, ono mi to akosi fungovalo včera, ale dnes už tak moc nie a nie som si vedomy toho žeby som robil nejake zmeny
_________________ PC: Procesor: INTEL Core i7-860, grafika: MSI R4890 Cyclone OC, 1GB DDR5, doska: Gigabyte GA-P55-UD3R, zdroj: Fortron 700W Everest 700 80+, RAM: 2x2GB Corsair XMS3 DHX |
|
Registrovaný: 09.04.11 Prihlásený: 11.01.14 Príspevky: 257 Témy: 26 Bydlisko: Kesa |
prečo máš tú nulu v uvodzovkách ?
_________________ NB - HP Pavilion DV7 3190 -- Windows® 7 Home Premium 64-bit -- Intel® Core™ i7-720QM 1,6 GHz az 2,8 Ghz Turbo Boost, 6 MB pamäte cache úrovne 2 -- 4 GB DDR3 -- disk 640 GB SATA 5400 ot/min -- rozlíšenie 1600 x 900 -- NVIDIA® GeForce® GT 230M -- 2 815 MB grafickej pamäte s vyhradenou pamäťou 1 GB DDR3 -- pripojenie 802.11 a/b/g/n |
|
Registrovaný: 13.11.07 Prihlásený: 20.08.16 Príspevky: 1702 Témy: 0 | Napísal chrono: 12.10.2011 14:44 | |
|
Pretože c je char.
|
|
Registrovaný: 11.01.09 Prihlásený: 18.04.24 Príspevky: 1385 Témy: 9 Bydlisko: Hrinova | Napísal Fico: 12.10.2011 17:01 | |
|
@tomxi, neviem presne, co znamena ta kontrola, ale si si vedomy toho, ze tu:
Kód: ((cislo * 10 + c - '0') + ULONG_MAX)
dochadza k preteceniu? A podalsie ziaden udaj typu unsigned long nemoze byt vacsi ako ULONG_MAX.
|
|
Registrovaný: 17.07.08 Prihlásený: 24.01.13 Príspevky: 143 Témy: 37 | Napísal autor témy tomxi: 12.10.2011 17:06 | |
|
som si toho vedomy. nepotrebujem aby to fungovalo presne takto. ja len potrebujem zistit ktore z dvoch cisel je vacsie.. ci ULONG_MAX ci cislo
_________________ PC: Procesor: INTEL Core i7-860, grafika: MSI R4890 Cyclone OC, 1GB DDR5, doska: Gigabyte GA-P55-UD3R, zdroj: Fortron 700W Everest 700 80+, RAM: 2x2GB Corsair XMS3 DHX |
|
Registrovaný: 11.01.09 Prihlásený: 18.04.24 Príspevky: 1385 Témy: 9 Bydlisko: Hrinova | Napísal Fico: 12.10.2011 17:12 | |
|
tomxi píše: som si toho vedomy
Zrejme nie, pretoze potom by si vedel, ze cokolvek + ULONG_MAX sa zacne pocitat od nuly a teda automaticky to nemoze byt vacsie ako ULONG_MAX Ak chces porovnavat nejake cislo s toutu konstantou, potrebujes vacsi datovy typ - logicky, pretoze pre datovy typ unsigned long je to maximalne cislo. Cize mozes pouzit napr double, staci len pretypovat porovnavanie:
Kód: if ( ( (double)(cislo * 10 + c - '0') + ULONG_MAX) > ULONG_MAX)
|
|
Registrovaný: 13.11.07 Prihlásený: 20.08.16 Príspevky: 1702 Témy: 0 | Napísal chrono: 12.10.2011 17:21 | |
|
Ten test tam využíva práve to pretečenie (preto tam je to + ULONG_MAX). Ak tam použije double, tak môže nastať problém s tým, že tam nebude presne celé číslo a môže to robiť zvláštne veci. V oboch prípadoch bude funkčnosť záležať tak trochu na náhode.
Ja osobne by som skôr ULONG_MAX vydelil 10 a z toho vychádzal.
|
|
Registrovaný: 11.01.09 Prihlásený: 18.04.24 Príspevky: 1385 Témy: 9 Bydlisko: Hrinova | Napísal Fico: 12.10.2011 17:27 | |
|
chrono píše: Ten test tam využíva práve to pretečenie (preto tam je to + ULONG_MAX)
Ale ak v tejto podmienke:
Kód: if (((cislo * 10 + c - '0') + ULONG_MAX) > ULONG_MAX) dosadime miesto prvej zatvorky lubovolne cislo: Kód: if ( ( 1 + ULONG_MAX ) > ULONG_MAX )
nikdy v zivote nebude tato podmienka splnena, pokial sa pohybujeme v datovom type unsigned long, kde ja maximalne cislo prave ULONG_MAX.
|
|
Registrovaný: 13.11.07 Prihlásený: 20.08.16 Príspevky: 1702 Témy: 0 | Napísal chrono: 12.10.2011 17:29 | |
|
Áno a predpokladám, že tá podmienka s tým pretečením pôvodne vyzerala trochu inak.
|
|
Registrovaný: 17.07.08 Prihlásený: 24.01.13 Príspevky: 143 Témy: 37 | Napísal autor témy tomxi: 13.10.2011 23:50 | |
|
spravil som to s tym cislom vydelenim desiatimi vdaka
_________________ PC: Procesor: INTEL Core i7-860, grafika: MSI R4890 Cyclone OC, 1GB DDR5, doska: Gigabyte GA-P55-UD3R, zdroj: Fortron 700W Everest 700 80+, RAM: 2x2GB Corsair XMS3 DHX |
|
| Stránka: 1 z 1
| [ Príspevkov: 10 ] | |
Podobné témy | Témy | Odpovede | Zobrazenia | Posledný príspevok |
---|
| externy HDD nechce kopirovat subory vacsie ako 6GB v Pevné disky a radiče | 8 | 1612 | 22.06.2010 16:39 cuckocuc | | Cislo ako string v CSV v PHP, ASP | 2 | 635 | 23.06.2008 11:55 stenley | | Word 2007 / ako vlozim cislo strany? v Ostatné programy | 1 | 1065 | 13.12.2008 19:28 dulius | | AKO MAM ZMENIT CISLO NA WIN XP v Operačné systémy Microsoft | 13 | 1727 | 07.09.2005 17:58 Pufo Callo | | Ako zistit najmensie a najvacsie cislo v C v Assembler, C, C++, Pascal, Java | 4 | 2655 | 19.11.2009 15:09 reDo | | Stránka na zistenie ako mi pôjdu hry v Služby a webstránky | 2 | 4351 | 14.02.2013 13:03 Gravedigger | | VACSIE TITULKY v Ostatné programy | 15 | 2094 | 12.05.2007 16:43 Dzimbo | | Vacsie rozlisenie notebooku v Ostatné programy | 4 | 518 | 20.07.2008 21:40 ac.milan | | zistenie IP adresy, alebo ako mam zistit ci je FAKE uzivatel v Bezpečnosť a firewally | 1 | 3481 | 22.11.2010 0:58 shiro | | Vacsie sluchatka hraju velmi ticho v Zvuk | 5 | 1003 | 21.02.2010 2:15 ac.milan | | Starostlivosť o väčšie množstvo tabletov v Smartfóny a tablety | 16 | 795 | 05.02.2014 12:37 kuki_sk | | Ext HDD nechce prijať väčšie súbory v Pevné disky a radiče | 5 | 301 | 22.04.2013 16:42 dano1805 | | I/P: DDR1 256mb ramky , aj väčšie množstvo , do PC v Predám | 8 | 609 | 10.02.2013 19:18 ramaya | | Tel. číslo v Krčma | 8 | 1101 | 20.01.2011 16:00 Daron | | Amstrongove číslo v Assembler, C, C++, Pascal, Java | 9 | 571 | 14.02.2017 18:40 GamerSK | | Nebere číslo v PHP, ASP | 10 | 736 | 18.04.2008 21:26 Svolo |
| Nemôžete zakladať nové témy v tomto fóre Nemôžete odpovedať na témy v tomto fóre Nemôžete upravovať svoje príspevky v tomto fóre Nemôžete mazať svoje príspevky v tomto fóre
|
|