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 05:55 | IT novinky

    Organizace Open Container Initiative (OCI) (Wikipedie), projekt nadace Linux Foundation, vydala Runtime Specification 1.3 (pdf), tj. novou verzi specifikace kontejnerového běhového prostředí. Hlavní novinkou je podpora FreeBSD.

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

    Nový open source router Turris Omnia NG je v prodeji. Aktuálně na Allegro, Alternetivo, Discomp, i4wifi a WiFiShop.

    Ladislav Hagara | Komentářů: 18
    včera 05:44 | Komunita

    Na YouTube a nově také na VHSky byly zveřejněny sestříhané videozáznamy přednášek z letošního OpenAltu.

    Ladislav Hagara | Komentářů: 0
    včera 04:33 | Komunita

    Jednou za rok otevírá společnost SUSE dveře svých kanceláří široké veřejnosti. Letos je pro vás otevře 26. listopadu v 16 hodin v pražském Karlíně. Vítáni jsou všichni, kdo se chtějí dozvědět více o práci vývojářů, prostředí ve kterém pracují a o místní firemní kultuře. Můžete se těšit na krátké prezentace, které vám přiblíží, na čem inženýři v Praze pracují, jak spolupracují se zákazníky, partnery i studenty, proč mají rádi open source a co

    … více »
    SUSEMAS | Komentářů: 1
    včera 04:22 | Komunita

    Na čem pracují vývojáři webového prohlížeče Ladybird (GitHub)? Byl publikován přehled vývoje za říjen (YouTube).

    Ladislav Hagara | Komentářů: 0
    včera 04:11 | Zajímavý článek

    Jeff Quast otestoval současné emulátory terminálu. Zaměřil se na podporu Unicode a výkon. Vítězným emulátorem terminálu je Ghostty.

    Ladislav Hagara | Komentářů: 10
    3.11. 22:55 | IT novinky

    Amazon bude poskytovat cloudové služby OpenAI. Cloudová divize Amazon Web Services (AWS) uzavřela s OpenAI víceletou smlouvu za 38 miliard USD (803,1 miliardy Kč), která poskytne majiteli chatovacího robota s umělou inteligencí (AI) ChatGPT přístup ke stovkám tisíc grafických procesů Nvidia. Ty bude moci využívat k trénování a provozování svých modelů AI. Firmy to oznámily v dnešní tiskové zprávě. Společnost OpenAI také nedávno

    … více »
    Ladislav Hagara | Komentářů: 8
    3.11. 16:22 | Pozvánky

    Konference Prague PostgreSQL Developer Day 2026 (P2D2) se koná 27. a 28. ledna 2026. Konference je zaměřena na témata zajímavá pro uživatele a vývojáře. Příjem přednášek a workshopů je otevřen do 14. listopadu. Vítáme témata související s PostgreSQL či s databázemi obecně, a mohou být v češtině či angličtině.

    TomasVondra | Komentářů: 0
    3.11. 13:22 | Nová verze

    Byl vydán Devuan 6 Excalibur. Přehled novinek v poznámkách k vydání. Kódové jméno Excalibur bylo vybráno podle planetky 9499 Excalibur. Devuan (Wikipedie) je fork Debianu bez systemd. Devuan 6 Excalibur vychází z Debianu 13 Trixie. Devuan 7 ponese kódové jméno Freia.

    Ladislav Hagara | Komentářů: 4
    3.11. 10:44 | IT novinky

    Společnost Valve aktualizovala přehled o hardwarovém a softwarovém vybavení uživatelů služby Steam. Podíl uživatelů Linuxu poprvé překročil 3 %, aktuálně 3,05 %. Nejčastěji používané linuxové distribuce jsou Arch Linux, Linux Mint a Ubuntu. Při výběru jenom Linuxu vede SteamOS Holo s 27,18 %. Procesor AMD používá 67,10 % hráčů na Linuxu.

    Ladislav Hagara | Komentářů: 1
    Jaké řešení používáte k vývoji / práci?
     (36%)
     (48%)
     (18%)
     (18%)
     (22%)
     (15%)
     (21%)
     (16%)
     (16%)
    Celkem 312 hlasů
     Komentářů: 15, poslední 2.11. 08:25
    Rozcestník

    Jak jsem se nachytal na ukazatelové aritmetice

    1.7.2009 20:22 | Přečteno: 1291× | programování | poslední úprava: 1.7.2009 20:25

    Psal jsem dneska jednoduchou třídu pro animované sprajty v OpenGL. Abych nemusel texturovací souřadnice počítat při každé změně snímku, předpočítal jsem si je všechny předem do bufferu. Když pak dojde na kreslení snímku, texturovací souřadnice zadám jednoduše jako offset do tohohle bufferu. V principu velmi jednoduchý kód, ale stejně se mi v něm podařilo vyrobit chybu, kterou jsem pak dlouho a nespokojeně hledal. Je to klasický přehmat v ukazatelové aritmetice – býval bych řekl, že takovou chybu bych neudělal, no ale zjevně ano:

    #include <stdio.h>
    
    typedef struct { int a, b; } dint;
    
    int main()
    {
        dint foo[] = {{1, 2}, {3, 4}};
        printf("%i\n", *(foo + 1));
        return 0;
    }
    

    Program samozřejmě vypíše trojku, protože operátor plus přičítá násobky základního typu pole, nikoliv bajty. Tenhle post jsem napsal především proto, abych si to pořádně natloukl do hlavy a příště si podobné radosti ušetřil :-)

           

    Hodnocení: 75 %

            špatnédobré        

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

    Komentáře

    Vložit další komentář

    1.7.2009 20:31 kralyk z abclinuxu | skóre: 29 | blog:
    Rozbalit Rozbalit vše Re: Jak jsem se nachytal na ukazatelové aritmetice
    No kdyby počítal bajty, tak by ses dostal na druhý bajt čísla 0x00000001, což by byla nula ;-)
    Jak jsi to vyřešil, přetypováním, nebo lezeš do tý struktury? Šlo by to imho takle:
    printf("%i\n", *((int*)foo + 1));
    
    zoul avatar 1.7.2009 20:44 zoul | skóre: 43 | blog: | Boskovice
    Rozbalit Rozbalit vše Re: Jak jsem se nachytal na ukazatelové aritmetice
    Ten skutečný kód vypadal trošku jinak:
    float *textureVertices;
    A za chvilku:
    const int textureOffset = currentFrame * 4 * sizeof(float);
    glTexCoordPointer(2, GL_FLOAT, 0, textureVertices+textureOffset);
    
    No a sizeof(float) bylo samozřejmě navíc, stačilo ho smazat.
    1.7.2009 23:54 kralyk z abclinuxu | skóre: 29 | blog:
    Rozbalit Rozbalit vše Re: Jak jsem se nachytal na ukazatelové aritmetice
    Aha, a jak inicializuješ textureVertices jen tak pro zajímavost?
    zoul avatar 2.7.2009 08:10 zoul | skóre: 43 | blog: | Boskovice
    Rozbalit Rozbalit vše Re: Jak jsem se nachytal na ukazatelové aritmetice
    int frameNo = 0, i = 0;
    while (frameNo <= numFrames)
    {
        textureVertices[i+0] = …;
        textureVertices[i+1] = …;
        textureVertices[i+2] = …;
        textureVertices[i+3] = …;
        i+=4; frameNo++;
    }
    
    2.7.2009 17:07 kralyk z abclinuxu | skóre: 29 | blog:
    Rozbalit Rozbalit vše Re: Jak jsem se nachytal na ukazatelové aritmetice
    Hmm... to mi furt nějak vrtá hlavou. Zaprvé bych očekával ve while cyklu spíš podmínku frameNo < numFrames než větší/rovno, protože frameNo inicializuješ frameNo = 0.
    Taky by dávalo smysl spíš samzat to * 4 než * sizeof(float).
    Projdi si ten kód pro sizeof(float) != 4 a imho to nepůjde, nebo jo?
    zoul avatar 2.7.2009 17:44 zoul | skóre: 43 | blog: | Boskovice
    Rozbalit Rozbalit vše Re: Jak jsem se nachytal na ukazatelové aritmetice
    Máš body za pozornost :) Kód je ale správně. Snímky animace jsou v souboru uložené vedle sebe, takže pravé dva vrcholy každého okénka tvoří levé dva vrcholy okénka následujícího. Pro texturování N snímků tím pádem stačí (N+1)*2 vrcholů a while jde od nuly do frameNo včetně (⇒ N+1). A když chci offset prvního vrcholu snímku číslo X, musím přeskočit dva vrcholy na každý z předchozích snímků. Dva vrcholy = čtyři floaty, proto *4. Ta optimalizace je celkem zbytečná, ale podle mě není nijak zvlášť nepřehledná, tak jsem ji tam nechal.
    2.7.2009 21:44 kralyk z abclinuxu | skóre: 29 | blog:
    Rozbalit Rozbalit vše Re: Jak jsem se nachytal na ukazatelové aritmetice
    Jo takhle... to N+1-1 se tedy vyruší na N. To *4 už je taky jasný.
    Upřímně řečeno, tohle jsou situace, kdy si beru do ruky papír a tužku a situaci si kreslím, abych se v tom vyznal.
    Doufám, že se mi za tohle na ČVUT nebudou smát... :-D
    zoul avatar 3.7.2009 12:58 zoul | skóre: 43 | blog: | Boskovice
    Rozbalit Rozbalit vše Re: Jak jsem se nachytal na ukazatelové aritmetice
    Příloha:
    Já kreslím jako o závod. Jednak se v tom člověk líp vyzná a jednak pak má v bločku spoustu zajímavě vypadajících čmáranic.
    Petr Bravenec avatar 2.7.2009 06:53 Petr Bravenec | skóre: 43 | blog: Bravenec
    Rozbalit Rozbalit vše Re: Jak jsem se nachytal na ukazatelové aritmetice
    Chjo. Chce to méně spoléhat na obecně známé pravdy a více používat vlastní hlavu:
    typedef struct { int a, b; } dint;
    
    int main() {
        dint foo[] = {{1, 2}, {3, 4}};
        printf("%i\n", foo[1].a);
        return;
        }
    
    Já bych si na konstrukci s ukazatelem v tom původním provedení netroufnul. Aniž bych si to uvědomoval, jistě by se mi už při prvním pohledu na strukturu dint mihla hlavou myšlenka "A v jakém vlastně pořadí jsou uložené složky a a b? Nemohl by se mi stát, že to bude potřeba přeložit na něčem, co zvolí pořadí opačné?" - A měl bych jasno.

    Obecně známá pravda tvrdí, že ukazatele jsou rychlejší. Moje hlava tvrdí, že to je možné, ale ve většině případů to za ty komplikace nestojí a i potom se to dá udělat mnohem bezpečněji.
    Petr Bravenec - Hobrasoft s.r.o.
    zoul avatar 2.7.2009 08:07 zoul | skóre: 43 | blog: | Boskovice
    Rozbalit Rozbalit vše Re: Jak jsem se nachytal na ukazatelové aritmetice
    Chce to méně spoléhat na obecně známé pravdy a více používat vlastní hlavu:
    To jsme si asi nerozuměli. Ten kód je jen ukázka, na které je dobře vidět chování operátoru + na ukazatelech. Samozřejmě, že bych se k foo mohl chovat jako k poli, ale tím by to celé jaksi ztratilo pointu.
    Obecně známá pravda tvrdí, že ukazatele jsou rychlejší. Moje hlava tvrdí, že to je možné, ale ve většině případů to za ty komplikace nestojí a i potom se to dá udělat mnohem bezpečněji.
    Ani v tom původním kódu jsem to nedělal kvůli rychlosti, prostě mi to tak přišlo nejpraktičtější. Asi bych si býval mohl napsat nějaké struktury a pracovat s tím kusem paměti trochu méně „naslepo“, bylo by to bezpečnější a čitelnější. To je fakt.
    Petr Bravenec avatar 2.7.2009 09:03 Petr Bravenec | skóre: 43 | blog: Bravenec
    Rozbalit Rozbalit vše Re: Jak jsem se nachytal na ukazatelové aritmetice
    Možná jsme si vážně nerozuměli. Vím, že to byla ukázka. V C a C++ jsem toho naprogramoval mraky a z dob začátečnických i z dob pokročilejších si pamatuji, že ukazatelová aritmetika je učebnicovými příklady C jazyků protlačována mnohem častěji, než je zdrávo. Nedivím se tomu, pro C laika je ukazatel mytickou vlastností jazyka C, je proto potřeba takového laika při učení patřičně potrápit a ukazatele procvičit, dokud se z ukazatelů nestane ona obecně známá pravda. Bobužel následkem toho vyrůstají z C programátorů občas... neuvažující zvířátka navyklá na naučenou cestičku a s egem příliš pyšným na to, že zvládli jinde tak neobvyklou a přitom tak skvělou a rychlou věc, jako jsou ukazatele, takže je jednodušší a mnohem přehlednější (a v C++ i přeprogramovatelná) možnost použít hranaté závorky vůbec nenapadne.

    Nechápejte to jako útok na vlastní osobu nebo ego. Snažil jsem se tímto okomentovat svůj vlastní vývoj v uvažování. Dneska už by se mi něco podobného asi nestalo, taky jsem mnohokrát dostal školení. Dneska dělám chyby mnohem jednodušší, z toho ty nejjednodušší se hledají nejhůř ;-)
    Petr Bravenec - Hobrasoft s.r.o.
    zoul avatar 2.7.2009 09:23 zoul | skóre: 43 | blog: | Boskovice
    Rozbalit Rozbalit vše Re: Jak jsem se nachytal na ukazatelové aritmetice
    Jo, tak to si rozumíme, souhlasím. Mám ten dojem, že když člověk mluví s OpenGL, občas mu nic jiného než ruční přístup k paměti nepomůže – OpenGL zkrátka chce těsně skládané pole floatů a basta. Býval bych si mohl nadefinovat strukturu pro jednotlivé vertexy a pak použít pole takových struktur, asi by to bylo lepší. (Místo přičítání offsetu v paměti bych sáhl na index v poli a chybu bych si ušetřil.) Jenže stejně musím pořád dávat pozor, aby šla výsledná struktura předhodit OpenGL jako posloupnost floatů s pevně daným pořadím, takže bych si o tolik nepomohl. Každopádně ano, ukazatelová aritmetika je zbytečný hazard a frajeřiny se nevyplácí.
    2.7.2009 16:22 Michal Kubeček | skóre: 71 | Luštěnice
    Rozbalit Rozbalit vše Re: Jak jsem se nachytal na ukazatelové aritmetice
    Jenže jak se v původním příspěvku píše, ten původní kód vypadal trochu jinak a pointer tam nebyl dereferencovaný. A kdybych měl porovnat p+1 a &(p[1]), už bych tak jednoznačně netvrdil, že je druhý zápis je přehlednější.

    Založit nové vláknoNahoru

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