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 00:11 | Nová verze

    Jonathan Thomas oznámil vydání nové verze 4.1 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ářů: 0
    včera 23:33 | Zajímavý článek

    Při běžné migraci virtuálního stroje mezi hypervizory se jeho MAC adresa přesune na jiný leaf switch. EVPN tuto změnu distribuuje pomocí BGP Type-2 route a MAC mobility sequence number. Problém nastává, pokud útočník podvrhne zdrojovou MAC adresu jiného zařízení. Leaf může změnu interpretovat jako legitimní přesun MAC a rozšířit ji přes BGP do celé fabric. Výsledkem může být přesměrování provozu určeného původnímu zařízení. Autor článku rozebírá možnosti detekce pomocí sledování MAC moves, BGP route reflektorů a kontroly na přístupové vrstvě.

    vencour | Komentářů: 0
    včera 15:11 | Nová verze

    Vývojáři desktopového prostředí Enlightenment (Wikipedie) a souvisejících knihoven Enlightenment Foundation Libraries (EFL) vydali nové verze. Enlightenment byl vydán ve verzi 0.28.0 a Enlightenment Foundation Libraries ve verzi 1.29.

    Ladislav Hagara | Komentářů: 3
    včera 13:55 | Zajímavý článek

    Cloudflare zjistil, že některé odpovědi modelu GLM-5.3 obsahovaly části dat z předchozích požadavků jiných zákazníků. Příčinou byla kombinace chybné konfigurace a chyby v inference enginu SGLang. Model podporoval kontextové okno 1 048 576 tokenů, ale GPU KV cache pool měl kapacitu pouze 681 280 tokenů. Při překročení kapacity docházelo k nesprávnému zpracování odmítnutého požadavku. Decode část systému následně pracovala se starými

    … více »
    vencour | Komentářů: 1
    včera 13:00 | Zajímavý článek

    Vývojáři Knot Resolver vysvětlují, jak změnili rozhodování o tom, které DNS záznamy ponechat v cache a které odstranit. Článek obsahuje skutečná měření: devět hodin DNS provozu při 2 000 QPS, srovnání cache o velikosti 25 MB a 40 GB a také porovnání s BIND 9, kromě algoritmů obsahuje konkrétní doporučení pro konfiguraci a diagnostiku.

    vencour | Komentářů: 0
    30.10. 13:44 | IT novinky

    Největší kryptoměnová burza světa Binance se stala terčem útoku, při kterém podvodníci odcizili během několika minut kryptoměny v hodnotě přibližně 6,3 miliardy dolarů. Jedná se o největší kryptoměnovou krádež v historii, přibližně čtyřikrát větší než loňský útok na burzu Bybit. Binance se podařilo ve spolupráci s partnery zmrazit aspoň aktiva v hodnotě zhruba 3 miliard dolarů a slíbila, že veškeré ztráty pokryje z vlastních prostředků.

    Ladislav Hagara | Komentářů: 16
    30.10. 02:16 | Bezpečnostní upozornění

    Zranitelnost CVE-2026-98432 s CVSS 9.8 odhalila AI od společnosti Anthropic. Jedná se o kritickou chybu v implementaci MPTCP (multipath TCP). Debian vydal patche 16.10. a 22.10., ale např. Ubuntu je zatím bez opravy. Více informací na The Hacker News.

    Max | Komentářů: 20
    29.10. 23:22 | Zajímavý software

    Na Slovensku vznikla úplne nová rally hra, ktorá je zadarmo a funguje vo Windowse, Linuxe či na Macu. Greenie Rally má viac ako 50 tratí a vozidiel, šampionáty či turnaje. Má retro feeling a imituje automobilové hry z prelomu tisícročí. Vyskúšate prejsť všetky mapy na Škode 130RS?

    Stanislav Hoferek | Komentářů: 13
    29.10. 14:33 | Komunita

    Do základního systému NetBSD -current byl přidán nový editor atto jako alternativa k editorům vi a xedit.

    Ladislav Hagara | Komentářů: 1
    29.10. 14:11 | IT novinky

    Společnost System76 představila kompaktní 11litrový Thelio Prime Desktop. S procesorem AMD Ryzen 9000. S Pop!_OS 24.04 LTS s desktopovým prostředím COSMIC nebo Ubuntu 24.04 LTS.

    Ladislav Hagara | Komentářů: 0
    Které desktopové prostředí na Linuxu používáte?
     (9%)
     (7%)
     (4%)
     (21%)
     (30%)
     (9%)
     (5%)
     (2%)
     (14%)
     (20%)
    Celkem 2959 hlasů
     Komentářů: 34, poslední 26.10. 08:24
    Rozcestník

    Masterujeme pole v céčku

    22.10.2010 14:00 | Přečteno: 1616× | Osobní | poslední úprava: 22.10.2010 13:58

    I když tento server není zaměřen na programování, Linux je napsán v céčku a céčková pole je oblast, která lidi často mate. V tomto zápisku bych ji chtěl trochu objasnit.

    Za většinu problémů může tvrzení, že pole je to stejné co ukazatel. Toto zjednodušení platí ve většině případů, nicméně kdokoliv se pokusí o složitější konstrukce a trochu se v nich vrtá, začne narážet na nesrovnalosti. Takže: pole není ukazatel a ukazatel není pole. Začneme od začátku. Ještě dodám, že jako typ dat předpokládám 32bitový integer.

    Co je to ukazatel?

    Ukazatel je proměnná, která obsahuje jedinou hodnotu, a to adresu v paměti. Situace vypadá takto:

    jméno:   | ptr  |
    hodnota: | 1424 |
    adresa:  | 2124 |
    
    jméno:   |      |      |      |      |      |
    hodnota: |  5   |   6  |   7  |   8  |   9  |
    adresa:  | 1424 | 1428 | 1432 | 1436 | 1440 |
    

    Proměnná ptr má hodnotu 1424, což je adresa prvního prvku pole (získaného např. funkcí malloc()). Pokud napíšeme ptr[i], kde i == 2, vyhodnotí se výraz takto: vezmi hodnotu ukazatele ptr (tedy 1424), přičti k ní i-krát velikost datového typu, na který ptr ukazuje (takže 2*4) a vrať hodnotu na této adrese (1424 + 2*4 = 1432, hodnota 7).

    Co je to pole?

    Pole je (strukturovaná) proměnná, která obsahuje více hodnot stejného typu. Situace v paměti:
    jméno:   | numbers                                  |
    hodnota: |     3 |   4  |   5  |   6  |   7  |   8  |
    adresa:  | 4000  | 4004 | 4008 | 4012 | 4016 | 4020 |
    

    Všimněte si, že identifikátor numbers se vztahuje na celé pole. Jak se potom vyhodnotí numbers[i], kde i == 2? Naprosto stejně jako v předchozím případě. Vezme se hodnota numbers... a tady je zakopaný pes. Identifikátor numbers obsahuje pole několika čísel, které jako takové hodnotu nemá. Proto se použije adresa prvního prvku pole (tedy ta s indexem 0) a dál se postupuje stejně jako v předchozím případě: k adrese se přičte i*velikost prvku pole a hodnota, která se nachází na výsledné adrese (4000 + 2*4 = 4008, hodnota 5) se vrátí.

    Porovnání

    Pro pole a ukazatele tedy můžeme použít ono zjednodušení, protože ve většině případů se pole tváří jako ukazatel na první prvek. Říkám většině, protože se najdou dvě výjimky:

    Operátor sizeof()

    Zatímco sizeof(ptr) vrátí velikost ukazatele (na 32bitovém stroji 4), sizeof(numbers) vrátí součin počtu prvků a velikosti jednoho prvku (velikost pole v bytech, v našem případě 6*4 = 24).

    Operátor &

    Pro ukazatel je situace jednoduchá: výsledkem je adresa ukazatele na integer (datový typ **int). Pro pole je zajímavější: vznikne ukazatel na pole n čísel.

    Pozor, ukazatel na pole N čísel (N musí jít vyhodnotit v době překladu) definujeme takto:

    int (*ptrarr)[N]; //ukazatel na pole N integeru
    int  *ptrarr[N];  // SPATNE! pole N ukazatelu na integer
    

    Tady se zastavím, i když zápis nemusí být na první pohled jasný, protože se dostáváme k dvourozměrným polím, ke kterým je potřeba udělat odbočku stranou. Tedy prosím o kritiku, než se dostanu k něčemu zajímavějšímu.

    Použitá literatura:
    Ing. Miroslav Virius, Csc: Pasti a propasti jazyka C++, 2. aktualizované a rozšířené vydání, ISBN 80-251-0509-1

           

    Hodnocení: 82 %

            špatné • dobré        

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

    Komentáře

    Vložit další komentář

    22.10.2010 14:16 black boy
    Rozbalit Rozbalit vše Re: Masterujeme pole v céčku
    už som to skoro prečital ako "Masturbujete pole v céčku" :-)
    22.10.2010 20:16 pht | skóre: 48 | blog: pht
    Rozbalit Rozbalit vše Re: Masterujeme pole v céčku
    Ono to ale tak nějak ve výsledku je.
    In Ada the typical infinite loop would normally be terminated by detonation.
    mess avatar 22.10.2010 15:45 mess | skóre: 43 | blog: bordel | Háj ve Slezsku - Smolkov
    Rozbalit Rozbalit vše Re: Masterujeme pole v céčku
    Zní to zajímavě, pokračuj :-)
    Cez párne mesiace zošíváš vaginy, cez neparne montuješ hajzle.
    22.10.2010 19:27 realharo
    Rozbalit Rozbalit vše Re: Masterujeme pole v céčku
    Je nejaký rozdiel medzi int x(char *c) {} a int x(char c[]) {}?
    22.10.2010 19:32 ____ | skóre: 15 | blog: _
    Rozbalit Rozbalit vše Re: Masterujeme pole v céčku
    Prakticky snad ne.
    22.10.2010 20:30 Dadam | skóre: 12 | blog: dadamovo
    Rozbalit Rozbalit vše Re: Masterujeme pole v céčku
    Tohle je to samé. Pro dvojrozměrné pole to už ale neplatí (dostanu se k tomu).
    A i B mají svoje výhody a nevýhody. Vyberte si to, co vám vyhovuje víc, a necpěte A tam, kam patří B.
    23.10.2010 15:17 ext3fs
    Rozbalit Rozbalit vše Re: Masterujeme pole v céčku
    Me by treba zajimalo zda je naprosto akvivalentni z hlediska kompilatoru:

    *(pole + i) = 1; a pole[i] = 1;

    Nekde jsem cetl ze praci s poli pres [] si stejne kompilator prevadi na *(). Je tomu tak?
    David Watzke avatar 23.10.2010 15:25 David Watzke | skóre: 74 | blog: Blog... | Praha
    Rozbalit Rozbalit vše Re: Masterujeme pole v céčku
    Zkusil jsem zkompilovat obě varianty pomocí GCC a binárky nejsou zcela identické.
    “Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
    michich avatar 23.10.2010 19:42 michich | skóre: 51 | blog: ohrivane_parky
    Rozbalit Rozbalit vše Re: Masterujeme pole v céčku
    Binárky se blbě porovnávají. Zkompiluj si to do assembleru s gcc -S soubor.c. Tam by mělo být vidět, že je to stejné.
    David Watzke avatar 23.10.2010 20:03 David Watzke | skóre: 74 | blog: Blog... | Praha
    Rozbalit Rozbalit vše Re: Masterujeme pole v céčku
    Není to stejné.
    $ diff -u test1.s test2.s
    --- test1.s     2010-10-23 20:01:04.090000164 +0200
    +++ test2.s     2010-10-23 20:01:08.480000156 +0200
    @@ -1,4 +1,4 @@
    -       .file   "test1.c"
    +       .file   "test2.c"
            .text
     .globl main
            .type   main, @function
    @@ -10,9 +10,7 @@
            movq    %rsp, %rbp
            .cfi_offset 6, -16
            .cfi_def_cfa_register 6
    -       leaq    -16(%rbp), %rax
    -       addq    $4, %rax
    -       movl    $1, (%rax)
    +       movl    $1, -12(%rbp)
            movl    $0, %eax
            leave
            .cfi_def_cfa 7, 8
    test1 používá *(pole+1)=1 a test2 používá pole[1]=1.

    Ovšem jakmile povolím optimalizaci, alespoň -O1, tak to stejné je.

    “Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
    24.10.2010 09:37 Martin Mareš
    Rozbalit Rozbalit vše Re: Masterujeme pole v céčku
    Ano. Operátor a[b] je definován jako *(a+b).

    A jelikož *(a+b) je totéž jako *(b+a), pak také a[b] je totéž jako b[a].
    24.10.2010 10:31 pht | skóre: 48 | blog: pht
    Rozbalit Rozbalit vše Re: Masterujeme pole v céčku
    Není to hezké, když je implementace vzdálena účelu natolik že z ní lezou obskurní vedlejší efekty typu i[pole]=1.
    In Ada the typical infinite loop would normally be terminated by detonation.
    24.10.2010 10:49 Martin Mareš
    Rozbalit Rozbalit vše Re: Masterujeme pole v céčku
    Hu? Vzdálena účelu? V čem?
    24.10.2010 21:47 pht | skóre: 48 | blog: pht
    Rozbalit Rozbalit vše Re: Masterujeme pole v céčku
    No, účel pole[i] je ítý prvek pole, ne? Tak by měla znít definice. Že je to interně v implementaci převedeno na *(pole+i) by mělo být každému putna respektive do toho by nikomu nemělo být nic. A nezávisle na tom na co se to interně převede by němělo jít napsat i[pole] protože to je prostě sémantický nesmysl...
    In Ada the typical infinite loop would normally be terminated by detonation.
    24.10.2010 22:28 Martin Mareš
    Rozbalit Rozbalit vše Re: Masterujeme pole v céčku
    Ono je to jinak: Céčkové pole prostě je definováno jako ta pointerová konstrukce (data chovající se jako pole mohou vzniknout spoustou způsobů, které mají společné jen to, že se dají indexovat pomocí pointerové aritmetiky) a hranaté závorky jsou jen a pouze syntaktická zkratka. To je propastný rozdíl od pole definovaného pomocí hranatých závorek a pak nějak přes pointery (interně) implementovaného.
    25.10.2010 06:56 pht | skóre: 48 | blog: pht
    Rozbalit Rozbalit vše Re: Masterujeme pole v céčku
    hranaté závorky jsou jen a pouze syntaktická zkratka
    S tím souhlasím, i když je to zkratka jen pro indexování, nikoliv definice což je matoucí věc č.1 (int[2][3] a int** není totéž; nelze napsat int 3[foo] místo int foo[3])

    A matoucí věc č.2 je že syntaktická zkratka foo[3] nemusí a nemá mít za následek syntaktickou zkratku 3[foo].
    In Ada the typical infinite loop would normally be terminated by detonation.
    25.10.2010 08:56 Martin Mareš
    Rozbalit Rozbalit vše Re: Masterujeme pole v céčku
    Pokud je ta zkratka syntaktická, tak jí do typů hodnot nic není (na úrovni syntaxe neexistují).
    26.10.2010 06:54 pht | skóre: 48 | blog: pht
    Rozbalit Rozbalit vše Re: Masterujeme pole v céčku
    To je pravda, v tom případě jsem se vyjádřil špatně - ta implementace je vzdálena účelu v tom, že je to jen syntaktická záležitost, protože na hlubší úrovni jedno z toho smysl má a druhé je něco divného.
    In Ada the typical infinite loop would normally be terminated by detonation.
    26.10.2010 09:05 Martin Mareš
    Rozbalit Rozbalit vše Re: Masterujeme pole v céčku
    Co napáše větší škodu? Featura jazyka, kterou lze použít jak přirozeným, tak nepřirozeným způsobem, nebo taková, která je zbytečně komplikovaně definovaná, jenom proto, aby tím nepřirozeným způsobem použít nešla? Pan Occam by věděl ;-)
    29.10.2010 22:01 pht | skóre: 48 | blog: pht
    Rozbalit Rozbalit vše Re: Masterujeme pole v céčku
    Pan Occam by věděl
    Cimrman taky... "spočítali jste padlé".

    V podstatě by se dalo říct, že škoda na uživatelích toho jazyka je neomezeně velká, protože tuhle pitomost se musí každý učit. Na druhou stranu je jen malé množství překladačů, kde by bylo třeba řešit aby to nebyla pitomost.

    In Ada the typical infinite loop would normally be terminated by detonation.
    30.10.2010 20:16 Martin Mareš
    Rozbalit Rozbalit vše Re: Masterujeme pole v céčku
    To je s prominutím naprostá pitomost. Naprostá většina uživatelů Céčka o tom nikdy nepřemýšlela a hranaté závorky nepoužila jiným než intuitivním způsobem. Kde jste vzal nějakou škodu?
    31.10.2010 18:21 Dadam | skóre: 12 | blog: dadamovo
    Rozbalit Rozbalit vše Re: Masterujeme pole v céčku
    Já jsem tuhle "fíčuru" radši ani nezmiňoval. Jediné, co jsem o ní kdy četl, je, že je to syntaxe podobná některým assemblerům. Neznáte někdo nějaký takový?
    A i B mají svoje výhody a nevýhody. Vyberte si to, co vám vyhovuje víc, a necpěte A tam, kam patří B.
    31.10.2010 20:52 pht | skóre: 48 | blog: pht
    Rozbalit Rozbalit vše Re: Masterujeme pole v céčku
    Naprostá většina uživatelů Céčka o tom nikdy nepřemýšlela a hranaté závorky nepoužila jiným než intuitivním způsobem.
    Což je docela dobrý důvod proč by tam ta další "feature" *neměla* být.
    Kde jste vzal nějakou škodu?
    Já nikde... to byl Váš dotaz. Abychom nemluvili o dvou různých věcech - pro mne je zrovna *tahle* feature dost nezajímavá, respektive chápu důvody jejího vzniku. Spíš mě to štve jako instance neustále opakujícího se principu který jsem naznačil v 1. příspěvku.
    In Ada the typical infinite loop would normally be terminated by detonation.
    1.11.2010 09:06 Martin Mareš
    Rozbalit Rozbalit vše Re: Masterujeme pole v céčku
    Což je docela dobrý důvod proč by tam ta další "feature" *neměla* být.
    Ona to ale není další featura, nýbrž prostý důsledek definice.
    1.11.2010 18:14 pht | skóre: 48 | blog: pht
    Rozbalit Rozbalit vše Re: Masterujeme pole v céčku
    No budiž, tak to řekneme jinak: "... proč by definice měla být taková aby neměla takovéto důsledky [které nikdo nepotřebuje]". Pointa je furt stejná.
    In Ada the typical infinite loop would normally be terminated by detonation.
    1.11.2010 20:06 Martin Mareš
    Rozbalit Rozbalit vše Re: Masterujeme pole v céčku
    Protože pak ta definice bude zbytečně složitá?
    1.11.2010 20:57 pht | skóre: 48 | blog: pht
    Rozbalit Rozbalit vše Re: Masterujeme pole v céčku
    A takhle jsou zbytečně složité její důsledky - tak si vyberte.
    In Ada the typical infinite loop would normally be terminated by detonation.
    1.11.2010 23:51 Martin Mareš
    Rozbalit Rozbalit vše Re: Masterujeme pole v céčku
    Ty důsledky jsou triviální, pouze pohled, který jste si na ně zvolil Vy, je zbytečně složitý.

    (Mimochodem, definice libovolného turingovsky úplného programovacího jazyka má nepředstavitelně složité důsledky, počínaje třeba prostou existencí nevyčíslitelných problémů. Proti tomu jsou nějaké syntaktické a sémantické detaily naprosto irelevantní.)
    2.11.2010 07:08 pht | skóre: 48 | blog: pht
    Rozbalit Rozbalit vše Re: Masterujeme pole v céčku
    Ty důsledky jsou triviální, pouze pohled, který jste si na ně zvolil Vy, je zbytečně složitý.

    Já si nemyslím, že by to bylo o složitosti, ale souhlasím, že máme dva různé úhly pohledu.
    Mimochodem, definice libovolného turingovsky úplného programovacího jazyka má nepředstavitelně složité důsledky, počínaje třeba prostou existencí nevyčíslitelných problémů. Proti tomu jsou nějaké syntaktické a sémantické detaily naprosto irelevantní.
    Nemyslím si, že by míra složitosti měla být záminkou pro "držet hubu a krok" :-)
    In Ada the typical infinite loop would normally be terminated by detonation.

    Založit nové vlákno • Nahoru

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