abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 12:22 | IT novinky

    Evropská směrnice NIS2 přináší nové požadavky v oblasti kybernetické bezpečnosti, které se promítají také do správy doménových jmen. Do českého právního řádu je směrnice implementována prostřednictvím nového zákona o kybernetické bezpečnosti. Jedním z praktických důsledků této legislativní změny je posílení požadavků na dostupnost a správnost kontaktních údajů držitelů domén. Správce registru domény .cz, sdružení CZ.NIC, je v

    … více »
    Ladislav Hagara | Komentářů: 1
    dnes 01:55 | Nová verze

    Jonathan Thomas oznámil vydání nové verze 3.5.0 video editoru OpenShot (Wikipedie). Zdrojové kódy OpenShotu jsou k dispozici na GitHubu. Ke stažení je i balíček ve formátu AppImage. Stačí jej stáhnout, nastavit právo na spouštění a spustit.

    Ladislav Hagara | Komentářů: 1
    dnes 00:55 | Nová verze

    Byla vydána (𝕏, Bluesky) nová verze 2026.1 linuxové distribuce navržené pro digitální forenzní analýzu a penetrační testování Kali Linux (Wikipedie). Přehled novinek se seznamem 8 nových nástrojů v oficiálním oznámení na blogu.

    Ladislav Hagara | Komentářů: 0
    včera 16:33 | IT novinky

    Vláda jmenovala novým zmocněncem pro digitalizaci a strategickou bezpečnost prvního náměstka ministra vnitra Lukáše Klučku. Ten ve funkci nahradil poslance Roberta Králíčka poté, co Králíček na tento post vládního zmocněnce rezignoval. Klučka chce do roka digitalizovat všechny státní služby tak, aby vyhověly zákonu o právu na digitální služby, přičemž dosavadní plán Fialovy vlády počítal s dokončením digitalizace až někdy v roce

    … více »
    NUKE GAZA! 🎆 | Komentářů: 11
    včera 13:55 | Nová verze

    Byl vydán Mozilla Firefox 149.0. Přehled novinek v poznámkách k vydání a poznámkách k vydání pro vývojáře. Vypíchnout lze bezplatnou vestavěnou VPN s 50 GB přenesených dat měsíčně, zobrazení dvou webových stránek vedle sebe v jednom panelu (split view) nebo možnost přidat poznámky k panelům (Firefox Labs). Řešeny jsou rovněž bezpečnostní chyby. Nový Firefox 149 bude brzy k dispozici také na Flathubu a Snapcraftu.

    Ladislav Hagara | Komentářů: 5
    včera 13:22 | Nová verze

    Byly vydány nové verze 5.3.0 a 6.0.0 svobodného multiplatformního programu pro skicování, malování a úpravu obrázků Krita (Wikipedie). Přehled novinek i s náhledy a videi v poznámkách k vydání. Obě verze vycházejí ze stejného zdrojového kódu – rozdíl je v použitých verzích Qt a KDE Frameworks. Krita 6.0.0 je první vydání postavené na Qt 6 a stále je považovaná za experimentální. Má lepší podporu Waylandu. Přináší podporu protokolu Wayland

    … více »
    Ladislav Hagara | Komentářů: 1
    včera 04:22 | Nová verze

    Byla vydána nová verze 10.2 z Debianu vycházející linuxové distribuce DietPi pro (nejenom) jednodeskové počítače. Přehled novinek v poznámkách k vydání. Vypíchnout lze nové balíčky Immich, Immich Machine Learning, uv a RustDesk Client.

    Ladislav Hagara | Komentářů: 0
    23.3. 22:11 | Nová verze

    TypeScript (Wikipedie), tj. JavaScript rozšířený o statické typování a další atributy, byl vydán v nové verzi 6.0. Příští verze 7.0 je kvůli výkonu přepisována do programovacího jazyka Go.

    Ladislav Hagara | Komentářů: 0
    23.3. 20:33 | Zajímavý článek

    Christian Schaller z Red Hatu na svém blogu popsal své zkušenosti s používáním AI při vývoji open source aplikací pro Linux. Pomocí různých AI aktualizoval nebo vytvořil aplikace Elgato Light GNOME Shell extension, Dell Ultrasharp Webcam 4K, Red Hat Planet, WMDock, XMMS resuscitated (aktualizace z GTK 2 a Esound na GTK 4, GStreamer a PipeWire) a Monkey Bubble. SANE ovladač pro skener Plustek OpticFilm 8200i se mu zatím nepovedl.

    Ladislav Hagara | Komentářů: 6
    23.3. 19:44 | IT novinky

    Americké firmy Tesla a SpaceX postaví v texaském Austinu moderní komplex na výrobu čipů pro umělou inteligenci (AI). Součástí projektu s názvem Terafab budou dvě moderní továrny na výrobu čipů – jedna se zaměří na automobily a humanoidní roboty, druhá na datová centra ve vesmíru. Uvedl to generální ředitel těchto firem Elon Musk. Projekt by podle odhadů měl stát 20 miliard USD (zhruba 425 miliard Kč).

    Ladislav Hagara | Komentářů: 19
    Které desktopové prostředí na Linuxu používáte?
     (15%)
     (7%)
     (1%)
     (12%)
     (29%)
     (2%)
     (5%)
     (1%)
     (13%)
     (24%)
    Celkem 1148 hlasů
     Komentářů: 27, poslední 17.3. 19:26
    Rozcestník

    Programátorská hádanka 4 - céčkovská zrada

    26.8.2010 19:00 | Přečteno: 1964× | poslední úprava: 26.8.2010 22:14

    Už dlouho nevyšla žádná programátorská hádanka, tak to musím napravit :-) Dnes bude trochu lehčí než minule. Setkal se s tím určitě každý, kdo alespoň přičuchnul k C nebo C++.
    Mám funkci Trim() pro ořezávání bílých znaků ze začátku a z konce textu. Když tedy např. dostane řetězec „ lenochod na pochodu\n“, vrátí „lenochod na pochodu“. Za bílý znak pro jednoduchost považuji znaky jen s ASCII hodnotou menší nebo rovno než mezera (tedy mezeru a řídící znaky). Funkce přímo přepisuje vstupní řetězec; vzhledem k tomu, že se ořezáním řetězec nikdy neprodlouží, může si to dovolit.

    Zde je již kód:

    void Trim(char *str) {
      int zleva;     //kolik bílých znaků zleva oříznu
      for (zleva = 0; str[zleva] != '\0'; zleva++) {
        if (str[zleva] > ' ') break;
      }
    
      int i;      //zkopíruju zbytek řetězce
      for (i = 0; str[i+zleva] != '\0'; i++) {
        str[i] = str[i+zleva];
      }
            //najdu konec řetězce
      for (i--; i >= 0 && str[i] <= ' '; i--);
    
      str[i+1] = '\0';		//a oříznu
    }

    Celkem krátký kód, poměrně lehký, skoro školní úloha. Nicméně, tato funkce nepracuje správně :-) obsahuje minimálně 2 různé chyby, které způsobují, že existuje vstup, pro který nedává očekávaný výstup.

    Najdete je? ;-) Ještě dodávám, že kód můžete i debugovat, ačkoli vám to pravděpodobně moc nepomůže.

    Domněnky a řešení pište do komentářů. Vy ostatní se při přemýšlení samozřejmě do komentářů nedívejte ;-)

    Řešení:
    Na správné řešení přišel Ondrej 'SanTiago' Zajicek.

    První chyba je, že typ char je znaménkový, takže znaky >= 128 (typicky znaky s diakritikou, v libovolném kódování) jsou vlastně záporné. Z tohoto důvodu neprojdou podmínkou if (str[zleva] > ' ') a jdou uřezány společně s bílými znaky. Je to trochu od jazyka C/C++ zrada; sice je znaménkový typ konzistentní se standardní „znaménkovostí“ jiných typů, ale u řetězců toto nemá význam; neumím si představit, kdy bych využil, že ASCII >= 128 je reprezentováno zápornými hodnotami. Naopak je mnoho případů, kdy dochází k chybám a podivným nelogičnostem (viz např. tato ukázka). V Javě jsou třeba všechny typy striktně znaménkové, ale typ char je jediný neznaménkový (16bitový). Taktéž i jiné jazyky nikdy neberou znak jako záporné číslo.

    Druhou chybou je použití typu int k indexování. Typ int je 4bajtový (nebo 2bajtový v 16bitovém prostředí) a nehodí se tak pro adresaci paměti. K adresaci paměti je vhodné použít typ size_t (neznaménkový) nebo ptrdiff_t (znaménkový). Tyto typy tak veliké, jak veliký je ukazatel; na 32bitovém mají 4 bajty, na 64bitovým 8 bajtů. V tomto případě by se program v 64bitovém prostředí zacyklil na prvním cyklu při 2 GiB dlouhém řetězci. Na 32bitovém prostředí by pak neořízl řetězec zprava (hned by vyskočil z třetí podmínky).        

    Hodnocení: 75 %

            špatnédobré        

    Anketa

    Jak těžká je tato hádanka?
     (10 %)
     (0 %)
     (3 %)
     (6 %)
     (11 %)
     (70 %)
    Celkem 63 hlasů

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

    Komentáře

    Vložit další komentář

    vlastikroot avatar 26.8.2010 19:21 vlastikroot | skóre: 24 | blog: vlastikovo | Milevsko
    Rozbalit Rozbalit vše Re: Programátorská hádanka 4 - céčkovská zrada
    Sakra! Obě jsem našel, až když jsem zahlasoval, že nevidim ani jednu:-D
    We will destroys the Christian's legion ... and the cross, will be inverted
    vlastikroot avatar 26.8.2010 19:28 vlastikroot | skóre: 24 | blog: vlastikovo | Milevsko
    Rozbalit Rozbalit vše Re: Programátorská hádanka 4 - céčkovská zrada
    Ne, spíš to vypadá, že vidim chyby tam, kde vlastně nejsou.
    We will destroys the Christian's legion ... and the cross, will be inverted
    Aleš Janda avatar 26.8.2010 20:17 Aleš Janda | skóre: 23 | blog: kýblův blog | Praha
    Rozbalit Rozbalit vše Re: Programátorská hádanka 4 - céčkovská zrada
    Tak napiš, které vidíš :-)
    26.8.2010 19:51 jas | skóre: 13 | blog: blag
    Rozbalit Rozbalit vše Re: Programátorská hádanka 4 - céčkovská zrada
    Staci NULL a "" alebo sa nad tym treba skutocne zamysliet (a najst este treti vstup)?
    26.8.2010 19:58 Semo | skóre: 45 | blog: Semo
    Rozbalit Rozbalit vše Re: Programátorská hádanka 4 - céčkovská zrada
    NULL nechapem ako vstup, ktory nefunguje. Ako by si definoval trimovanie? A bud blbo vidim alebo "" zbehne ok. Ale napr "   " nezbehne ok - neotrimuje
    If you hold a Unix shell up to your ear, you can you hear the C.
    Aleš Janda avatar 26.8.2010 20:19 Aleš Janda | skóre: 23 | blog: kýblův blog | Praha
    Rozbalit Rozbalit vše Re: Programátorská hádanka 4 - céčkovská zrada
    Více mezer také otrimuje - ořízne to ten příkaz úplně na konci, protože 'i' tam bude -1.

    NULL není platný vstup, takže to na něm zhavaruje (a je to správně) - to neberu jako chybu.
    26.8.2010 20:24 Semo | skóre: 45 | blog: Semo
    Rozbalit Rozbalit vše Re: Programátorská hádanka 4 - céčkovská zrada
    Ha, vravel som ze blbo vidim, nevsimol som si ";" na konci 2. for cyklu.
    If you hold a Unix shell up to your ear, you can you hear the C.
    26.8.2010 19:54 maddoxik | skóre: 10 | blog: maddoxikovo
    Rozbalit Rozbalit vše Re: Programátorská hádanka 4 - céčkovská zrada
    Nejsem programator, ale tipnul bych, ze se nekontroluji meze, takze v pripade hooooooodne dlouheho retezce pretece promenna zleva a pak dohavaruje ten druhy cyklus, protoze index i bude zaporny.
    Aleš Janda avatar 26.8.2010 20:20 Aleš Janda | skóre: 23 | blog: kýblův blog | Praha
    Rozbalit Rozbalit vše Re: Programátorská hádanka 4 - céčkovská zrada
    Jsi blízko jedné z chyb ;-)
    26.8.2010 20:24 Let_Me_Be | skóre: 20 | blog: cat /proc/idea/current | Brno
    Rozbalit Rozbalit vše Re: Programátorská hádanka 4 - céčkovská zrada
    Ono by to chtelo definovat co je validni vstup.
    Linked in profil - Můj web - Nemůžete vyhrát hádku s blbcem. Nejdřív vás stáhne na svoji úroveň a pak ubije zkušenostmi.
    26.8.2010 20:30 Let_Me_Be | skóre: 20 | blog: cat /proc/idea/current | Brno
    Rozbalit Rozbalit vše Re: Programátorská hádanka 4 - céčkovská zrada
    A taky jestli to ma delat to co je napsano v zadani, nebo opravdu Trim.
    Linked in profil - Můj web - Nemůžete vyhrát hádku s blbcem. Nejdřív vás stáhne na svoji úroveň a pak ubije zkušenostmi.
    Aleš Janda avatar 26.8.2010 20:35 Aleš Janda | skóre: 23 | blog: kýblův blog | Praha
    Rozbalit Rozbalit vše Re: Programátorská hádanka 4 - céčkovská zrada
    Validní vstup je jakýkoli řetězec typu char*, neNULLová hodnota, ukončená '\0'. Může být i prázdný.

    Ořezávají se všechny řídící znaky ASCII < 32 a mezera. Myslel jsem, že je to standardní chování trimu, teď vidím, že např. PHP standardně ořezává jen některé řídící znaky, ale to je víceméně jen detail.
    26.8.2010 20:37 Let_Me_Be | skóre: 20 | blog: cat /proc/idea/current | Brno
    Rozbalit Rozbalit vše Re: Programátorská hádanka 4 - céčkovská zrada
    No, ono totiz < 32 je neco jineho nez 0..32
    Linked in profil - Můj web - Nemůžete vyhrát hádku s blbcem. Nejdřív vás stáhne na svoji úroveň a pak ubije zkušenostmi.
    26.8.2010 20:04 sivlk | skóre: 15 | blog: sivlk
    Rozbalit Rozbalit vše Re: Programátorská hádanka 4 - céčkovská zrada
    Ako mam hlasovat ked som nasiel 3 chyby?
    Aleš Janda avatar 26.8.2010 20:20 Aleš Janda | skóre: 23 | blog: kýblův blog | Praha
    Rozbalit Rozbalit vše Re: Programátorská hádanka 4 - céčkovská zrada
    Jaké?
    26.8.2010 21:05 Ondrej 'SanTiago' Zajicek
    Rozbalit Rozbalit vše Re: Programátorská hádanka 4 - céčkovská zrada
    1) Indexuje mimo meze na vstupu slozenym ze samych mezer.

    2) trimuje i znaky s nahozenym nejvyssim bitem, protoze char je obvykle interpretovan jako signed.

    3) Na 64bit Linuxu se zacykli se na stringu delsim nez 4 GB :–)
    Aleš Janda avatar 26.8.2010 21:16 Aleš Janda | skóre: 23 | blog: kýblův blog | Praha
    Rozbalit Rozbalit vše Re: Programátorská hádanka 4 - céčkovská zrada
    1) Indexuje mimo meze na vstupu slozenym ze samych mezer.

    Proč myslíte? V kterém cyklu?

    2) trimuje i znaky s nahozenym nejvyssim bitem, protoze char je obvykle interpretovan jako signed.

    Gratuluji, toto je ta první chyba :-)

    3) Na 64bit Linuxu se zacykli se na stringu delsim nez 4 GB :–)

    A gratuluji znova, toto je ta druhá chyba :-) konkrétně se zacyklí i na stringu delším než 2 GiB, a tedy i na 32bit :-)
    26.8.2010 21:24 Ondrej 'SanTiago' Zajicek
    Rozbalit Rozbalit vše Re: Programátorská hádanka 4 - céčkovská zrada
    konkrétně se zacyklí i na stringu delším než 2 GiB, a tedy i na 32bit
    Opravdu se rozbije i na 32bit systemu? Nejsem si teda presne jist, jak se chova pointerova arimetrika pri preteceni, ale tipoval bych ze to vezme modulo 2^32, takze se to bude prakticky chovat jako by byl index unsigned.
    26.8.2010 21:28 Ondrej 'SanTiago' Zajicek
    Rozbalit Rozbalit vše Re: Programátorská hádanka 4 - céčkovská zrada
    V takovem pripade by se na 32bit systemu na souboru vetsim nez 2 GB chovala spatne az treti smycka (skoncila by ihned), coz je trochu jiny pripad nez na 64bit systemu (indexace mimo meze v prvni smycce), takze to lze klasifikovat jako dve ruzne chyby. ;–)
    Aleš Janda avatar 26.8.2010 22:00 Aleš Janda | skóre: 23 | blog: kýblův blog | Praha
    Rozbalit Rozbalit vše Re: Programátorská hádanka 4 - céčkovská zrada
    Máte pravdu, po větším zamyšlení vlastně je to přesně tak - na 32bitech by to vlastně „náhodou“ fungovalo, ale rozbilo se to až dál. Zajímavé, jak je to vlastně zmatečné.

    Každopádně jste přišel na obě chyby, gratuluju :-)
    26.8.2010 22:25 mich | skóre: 16
    Rozbalit Rozbalit vše Re: Programátorská hádanka 4 - céčkovská zrada
    Nejspíš je to hodně hloupá otázka, ale přesto jí položím. Jak alokujete místo pro retezec vetsi nez maximalni hodnota size_t (=int)?
    je to teď v módě, na žive o tom furt píšou
    Aleš Janda avatar 26.8.2010 22:30 Aleš Janda | skóre: 23 | blog: kýblův blog | Praha
    Rozbalit Rozbalit vše Re: Programátorská hádanka 4 - céčkovská zrada
    Int je znaménkový, čili max. kladný index je 2^31. Funkce malloc přitom bere size_t, což je neznaménkový, čili 2^32 (na 64bit 2^64). Neplatí tedy, že int = size_t; myslím, že bych alokovat 3 GB klidně mohl.
    26.8.2010 21:18 Ondrej 'SanTiago' Zajicek
    Rozbalit Rozbalit vše Re: Programátorská hádanka 4 - céčkovská zrada
    Tak u 1) jsem se taky nechal nachytat, tohle zrejme funguje.

    Upresneni k 3) - vzhledem k signed indexu to selze uz na 2 GB stringu indexovanim mimo meze.
    26.8.2010 20:06 Let_Me_Be | skóre: 20 | blog: cat /proc/idea/current | Brno
    Rozbalit Rozbalit vše Re: Programátorská hádanka 4 - céčkovská zrada
    str[i+1] = '\0'; je out of bounds pro prazdny retezec a taky to nefunguje pro retezce ktere jsou jenom z bilych znaku

    Netusim jestli to je jedna nebo jsou to dve chyby.
    Linked in profil - Můj web - Nemůžete vyhrát hádku s blbcem. Nejdřív vás stáhne na svoji úroveň a pak ubije zkušenostmi.
    26.8.2010 20:10 Let_Me_Be | skóre: 20 | blog: cat /proc/idea/current | Brno
    Rozbalit Rozbalit vše Re: Programátorská hádanka 4 - céčkovská zrada
    Hmm, tak jsem se nechal nachytat.
    Linked in profil - Můj web - Nemůžete vyhrát hádku s blbcem. Nejdřív vás stáhne na svoji úroveň a pak ubije zkušenostmi.
    26.8.2010 20:14 Jarda
    Rozbalit Rozbalit vše Re: Programátorská hádanka 4 - céčkovská zrada
    void Trim(char **str)?
    26.8.2010 20:17 Jarda
    Rozbalit Rozbalit vše Re: Programátorská hádanka 4 - céčkovská zrada
    Ale nic, zacatek se nemeni.
    26.8.2010 20:23 R
    Rozbalit Rozbalit vše Re: Programátorská hádanka 4 - céčkovská zrada
    Nielen, ze je to zle, ale este to je aj neefektivne - kopiruje sa kus retazca, ktory sa hned potom zahodi.
    26.8.2010 20:39 Filip Jirsák | skóre: 67 | blog: Fa & Bi
    Rozbalit Rozbalit vše Re: Programátorská hádanka 4 - céčkovská zrada
    Okopírovat se to dá taky efektivněji než to posouvat bajt po bajtu.
    27.8.2010 19:18 Kvakor
    Rozbalit Rozbalit vše Re: Programátorská hádanka 4 - céčkovská zrada
    Ano, je neefektivní kopírovat řetězec, který ještě není ořizlý zprava, stačilo by prvně provést oříznutí z obou stran a pak teprve kopírovat. Případně to celé nacpat do jednoho jediného cyklu, aby se zbytečně nezaplácávala cache.
    26.8.2010 23:02 R
    Rozbalit Rozbalit vše Re: Programátorská hádanka 4 - céčkovská zrada
    Tu je najmenej jedna chyba:
    void trim(char *str) {
      char *begin = str, *end;
    
      while ((unsigned char)*begin <= ' ' && *begin != '\0')
        begin++;
    
      end = begin + strlen(begin);
      while ((unsigned char)*end <= ' ' && end > begin)
        end--;
    
      memmove(str, begin, end - begin + 1);
      str[end - begin + 1] = '\0';
    }
    
    Aleš Janda avatar 26.8.2010 23:18 Aleš Janda | skóre: 23 | blog: kýblův blog | Praha
    Rozbalit Rozbalit vše Re: Programátorská hádanka 4 - céčkovská zrada
    Tak trochu mi to dalo zabrat :-) ale pokud má předaný buffer jen jeden bajt (a tam je koncová nula, čili prázdný řetězec, pak begin = end = str a tudíž poslední řádek zapíše 0 na index 1 => za buffer.
    26.8.2010 23:38 __dark__
    Rozbalit Rozbalit vše Re: Programátorská hádanka 4 - céčkovská zrada
    Ty chyby jsou zřejmé, ale teď je třeba se trochu zamyslet. Nepoužívá náhodou i Qt/Java/.NET typ int pro velikost a indexaci datových struktur? Možná tu máme omezení do budoucna;-)
    29.8.2010 23:19 zulu
    Rozbalit Rozbalit vše Re: Programátorská hádanka 4 - céčkovská zrada
    Správně jsi napsal indexaci, zatímco autor píše o adresaci. K adresaci se int opravdu nehod, ale k indexaci náramně.
    27.8.2010 07:58 kolcon | skóre: 15 | blog: kolcon
    Rozbalit Rozbalit vše Re: Programátorská hádanka 4 - céčkovská zrada
    Zlaty Perl a jednoduche reseni regexpem...
    27.8.2010 08:18 Michal Kubeček | skóre: 71 | Luštěnice
    Rozbalit Rozbalit vše Re: Programátorská hádanka 4 - céčkovská zrada

    Přiznávám se bez mučení, že úvahu "považujme za bílý znak cokoli s kódem menším nebo rovným 32" jsem bral za natolik nesmyslnou, že jsem si prostě místo toho testu v duchu dosadil isspace() a chybu tudíž neodhalil, protože mne nenapadlo hledat chyták v podobě chybné implementace něčeho, co je samo o sobě chyba.

    Mimochodem, určitě je podle normy char znaménkový? Vždycky jsem měl za to, že je na implementaci, jestli bude char totéž co signed char nebo unsigned char, a programátor by tudíž neměl předpokládat ani jedno.

    27.8.2010 10:04 Karel Zak | blog: kzak
    Rozbalit Rozbalit vše Re: Programátorská hádanka 4 - céčkovská zrada
    Mimochodem, určitě je podle normy char znaménkový? Vždycky jsem měl za to, že je na implementaci, jestli bude char totéž co signed char nebo unsigned char, a programátor by tudíž neměl předpokládat ani jedno.
    C99 6.2.5 Types

    An object declared as type char is large enough to store any member of the basic execution character set. If a member of the *basic execution character set* is stored in a char object, its value is guaranteed to be nonnegative. If any *other character* is stored in a char object, the resulting value is *implementation-defined* but shall be within the range of values that can be represented in that type.

    5.2.1 Character sets

    Both the basic source and basic execution character sets shall have the following members: the 26 uppercase letters of the Latin alphabet, the 26 lowercase letters of the Latin alphabet, the 10 decimal digits, 29 graphic characters (pozn. zavorky, carky apod.)

    .. tedy zakladni znaky lze predpokladat jako signed, ale vse ostatni je implementation-defined.

    Dulezite je, ze to chovani je arch dependent, treba x86 GNU/Linux je signed, ale ARM je unsigned apod. Viz:

    http://www.network-theory.co.uk/docs/gccintro/gccintro_71.html

    Takze je vhodne bud kompilovat s -fsigned-char pokud trvate na tom, ze char ma nejake urcite znaminko. Jinak v kodu je vhodne pouzivat "char" jen tam kde se nepracuje se znaky, jinak striktne "unsigned char".

    Aleš Janda avatar 27.8.2010 10:18 Aleš Janda | skóre: 23 | blog: kýblův blog | Praha
    Rozbalit Rozbalit vše Re: Programátorská hádanka 4 - céčkovská zrada
    Joj, tak tohle je tedy opravdu zajímavé. O gcc přepínačích na znaménkovost jsem věděl, ale že je to na ARMu defaultně unsigned, to je pro mě novinka. Díky :-)
    27.8.2010 10:29 R
    Rozbalit Rozbalit vše Re: Programátorská hádanka 4 - céčkovská zrada
    Skus si dat retazce ako unsigned char * a pouzivat funkcie ako strlen() - kolko tam budes mat warningov...
    Jardík avatar 27.8.2010 22:33 Jardík | skóre: 40 | blog: jarda_bloguje
    Rozbalit Rozbalit vše Re: Programátorská hádanka 4 - céčkovská zrada
    Se dá vždycky přetypovat :-)
    Věřím v jednoho Boha.
    27.8.2010 10:36 Martin Mareš
    Rozbalit Rozbalit vše Re: Programátorská hádanka 4 - céčkovská zrada
    jsem si prostě místo toho testu v duchu dosadil isspace() a chybu tudíž neodhalil
    Pozor, s isspace() vznikne velice podobná chyba – není ho totiž dovoleno volat se záporným argumentem.
    Vždycky jsem měl za to, že je na implementaci, jestli bude char totéž co signed char nebo unsigned char, a programátor by tudíž neměl předpokládat ani jedno.
    Přesně tak.
    27.8.2010 23:57 rastos | skóre: 63 | blog: rastos
    Rozbalit Rozbalit vše Re: Programátorská hádanka 4 - céčkovská zrada
    Nedávno som stretol tiež takú hlúpu chybu. V jave som potreboval nájsť v reťazci A podreťazec B a podľa jeho pozície rozdeliť A na na časť, pred výskytom B, časť zhodnú s B a časť za výskytom B. Case insensitive. A práve tá case-insenstitivta bola riešená prevodom oboch stringov cez toUpper(). Fungovalo to fajn, až kým A neobsahovalo nemecké ostré "ß". To pri prevode cez String.toUpper() vyrobilo "SS" - čím A malo zrazu o jeden znak navyše a zrátané indexy boli tým pádom o jedna posunuté ;-) Vyriešené to bolo nakoniec cez regexp.
    Jardík avatar 28.8.2010 01:36 Jardík | skóre: 40 | blog: jarda_bloguje
    Rozbalit Rozbalit vše Re: Programátorská hádanka 4 - céčkovská zrada
    Ze ß to vyrobilo SS? Jako z jednoho znaku dva? Nebo to vyrobilo z 1 charu (ve smyslu datového typu) chary 2 (to SS nějaký "spojený znak")? Protože java používá ke kódování řetězců UTF-16, bylo by to naprosto v pořádku a je třeba s tím počítat. Nesnáším algoritmy, co si myslí co jeden char (jako datový typ), to jeden znak.
    Věřím v jednoho Boha.
    28.8.2010 12:28 rastos | skóre: 63 | blog: rastos
    Rozbalit Rozbalit vše Re: Programátorská hádanka 4 - céčkovská zrada
    "straße".length() vrátilo 6 ale "straße".toUpper().length() vrátilo 7, pretože "straße".toUpper() je "STRASSE" a to je 7 znakov.
    28.8.2010 13:18 Martin Mareš
    Rozbalit Rozbalit vše Re: Programátorská hádanka 4 - céčkovská zrada
    Ze ß to vyrobilo SS? Jako z jednoho znaku dva?
    Pokud ano, tak to jednalo zcela podle standardu: UniCode (alespoň ve verzi 5.0, do které zrovna koukám) ve svých case mappings opravdu definuje, že 00DF (German es-zed) má jako upper case 0053 0053 (SS). A stejně se, tuším, chová i německý pravopis.
    Jardík avatar 28.8.2010 17:20 Jardík | skóre: 40 | blog: jarda_bloguje
    Rozbalit Rozbalit vše Re: Programátorská hádanka 4 - céčkovská zrada
    A jsou to opravdu 2 znaky, nebo je to surrogate pair? Já to unicode nestuduji, ale pokud v řetězci takový znak je, tak String.length nevrátí počet znaků ve smyslu opravdových znaků, ale ve smyslu počtu prvků typu char.
    Teď vidím, že to surrogate pair není a že to jsou opravdu jen 2 písmena S - s takovou věcí jsem se ještě nesetkal, každopádně není dobré se spoléhat na String.length, pokud chci počet znaků.
    Věřím v jednoho Boha.
    28.8.2010 21:06 Martin Mareš
    Rozbalit Rozbalit vše Re: Programátorská hádanka 4 - céčkovská zrada
    On by si předně každý, kdo chce měřit délku unicodových řetězců, měl opravdu pořádně rozmyslet, co vlastně chce:
    • počet jednotek reprezentace (v UTF-8 nebo UTF-16)
    • počet codepointů
    • počet znaků (liší se v případě použití kombinujících znaků)

    Založit nové vláknoNahoru

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.