• úvod
  • témata
  • události
  • tržiště
  • diskuze
  • nástěnka
  • přihlásit
    registrace
    ztracené heslo?
    XCHAOSANSI C/C99 (specifikace), GNU C (gcc, glibc), Tiny C (tcc) a POSIX - ne nutně C++,g++,libstdc++ nebo Win32 API
    /* Toto je klub především pro lidi, pro které je programování jednou z mnoha massive multiplayer online počítačových her, které lze hrát.
        V tomto klubu hrozí sémantická hereze a nezdravě vysoký obsah syntaktického cukru. Nevhodné pro algoritmické diabetiky.
        Od účastníků debaty se předpokládá automaticky přístup k instalovanému GNU C: sudo apt-get install build-essential
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    C (programovací jazyk)#C99 Heslo na české Wikipedii
    Jazyk C - Základy praktického programování V Praze 2oo7 pro SSPŠ Tomáš Harvie Mudruňka a kolektiv - jak si programování v C představuje většina lidí
    http://stevenkobes.com/ctest.html C Programming Puzzlers - nepouštějte se do flamewars v tomhle klubu, pokud neuhodnete aspoň polovinu správně!
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    http://en.wikipedia.org/wiki/C99 C99 is a modern dialect of the C programming language.
    http://cprogramminglanguage.net/ C programming language
    http://cprogramminglanguage.net/c-programming-language-tutorial.aspx C programming language - úvod
    http://en.wikipedia.org/wiki/Criticism_of_the_C_programming_language C makes it easy to shoot yourself in the foot. (ještě že ne do hlavy...)
    http://en.wikipedia.org/wiki/C_preprocessor
    http://gcc.gnu.org/onlinedocs/gcc/Variadic-Macros.html C99 makra s proměnným počtem argumentů - __VA_ARGS__
    http://gcc.gnu.org/onlinedocs/gcc/ GNU C Compiler
    http://gcc.gnu.org/onlinedocs/gcc-4.2.2/gcc/Optimize-Options.html
    http://bellard.org/tcc/ Tiny C Compiler - prý C99 compliant (min. umí __VA_ARGS__) - vhodný pro skriptování v C - umí #!/usr/bin/tcc -run
    http://en.wikipedia.org/wiki/International_Obfuscated_C_Code_Contest - pokud jste neviděli tohle, tak jste ještě neviděli opravdu nečitelný C zdroják
    http://bellard.org/otcc/ Obfuscated Tiny C Compiler - z tohohle vtípku vznikl Tiny C compiler
    http://en.wikipedia.org/wiki/ANSI_C Jak se střelit do nohy standardizovaným způsobem.
    http://eli-project.sourceforge.net/c_html/c.html ANSI C Specification
    http://www.lysator.liu.se/c/ Různý ANSI C bordel
    http://www.cs.rit.edu/~ats/books/ooc.pdf Object Oriented Programming with ANSI-C - a pak že to nejde
    http://en.wikipedia.org/wiki/Longjmp co jsou to setjmp()/longjmp() knihovní funkce (pro všechny, podle kterých to bez C++ try { } catch() ... nejde)
    http://groups.google.com/group/comp.lang.c++.moderated/browse_thread/thread/dcdc710c27f47c72 C neumí správně počítat (?)
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    http://www.fastcgi.com/ FastCGI is simple because it is actually CGI with only a few extensions.
    http://www.metalshell.com/source_code/18/Mysql_Select.html How to do a simple connection and select with mysql
    http://xmlsoft.org/ The XML C parser and toolkit of Gnome
    http://curl.haxx.se/libcurl/ libcurl - the multiprotocol file transfer library
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    https://dev.arachne.cz/svn/cll1h SVN/Trac jazyka C<<1 (user-friendly nadstavba nad ANSI C99 - ve stylu JQuery vs. JavaScript)
    Benchmark iterace a serializace stringů v různých jazycích vs. v C
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        moderátor se velice zhruba řídí zvyklostmi moderace, která kdysi platila v řadě konferencí sítě FidoNet ... C != 0xdead */
    rozbalit záhlaví
    XCHAOS
    XCHAOS --- ---
    REDGUY: ...a rozhodně jen pro některé architektury, ano. prostě občas ty stránky přeskládat lze, občas ne.

    třeba u mě by se to částečně tlouklo s tou "kontextovou správou paměti": ne úplně, pravda, ale je to jeden z důvodů, proč jsem se na to zatím nadšeně nevrhnul.
    REDGUY
    REDGUY --- ---
    XCHAOS: realloc() na současných architekturách je výrazně efektivnější - hele, jen tak pro kontrolu, pochopil jsi ze "realloc nekopiruje pamet" plati jen nekdy, pro pomerne specificke pripady?
    ANT_39
    ANT_39 --- ---
    XCHAOS: jak sakra jednoduše udržovat ty indexy použitelné i pro přidání nového prvku Jo, potrebujes to orakulum :)
    XCHAOS
    XCHAOS --- ---
    ANT_39: no ano, realloc() je o tom, že nakonec stejně asi použiju pole místo nějakého "vylepšeného spojového seznamu" - na tuhle strukturu SAMOZŘEJMĚ vliv nemá, je to o diskuzi, co použít MÍSTO ní.

    spojový seznam je ale pořád výborný, pokud se ti může stát, že přidáváš prvek někam náhodně doprostřed: tam je "posouvání" části toho pole pointerů pořád operace která může mít režii - zvlášť při vkládání na začátek. pole pointerů je skvělé, pokud víš kolik toho bude, a pokud víš, že všechny prvky dostaneš hned na začátku, a pak už žádný bud nepřibude, nebo (diskutabilně) přibude jen na konec.

    tenhle "indexovaný spojový seznam" je také dobrý, pokud bys ho vybudoval na začátku, a pak věděl, že potřebuješ jen sem tam něco ubrat nebo přidat: pak by si s ním pracoval jako se spojovým seznam (a pouze odmázaval ty indexy, které případně odkazují na vymazaný prvek). místo pro přidání nového prvku taky krásně najdeš s logaritmickou složitostí (srovnej to s O(N) složitostí operace "pošoupávání všeho" u pole pointerů...)

    od začátku mám jen jeden jediný problém: jak sakra jednoduše udržovat ty indexy použitelné i pro přidání nového prvku ? kdybych na tohle měl trik, tak je tahle struktura fakt bomba (ok, sice zabere 2x tolik paměti, než prosté pole pointerů - ale právě proto, že je tam tenhle tradeoff, mi přijde, že bych obětováním této paměti - a případně uložením nějaké "hint" informace do těch seek pointerů - např. odkazy na začátek, odkazy na NULL, odkazy na smluvené hodnoty NIL, kterých nesmí nabývat žádný prvek seznamu, apod. - mohl získat jako bonus nějakou úsporu strojového času...)
    ANT_39
    ANT_39 --- ---
    XCHAOS: No ano, setridit to setridis, ale nevyuzijes toho faktu, ze je to setridene, zejo. Takze ano, je to o tech seek-ahead.

    Ted reaguju na to od té doby, co umím "zvětšovat pole", mě už potřeba téhle datové struktury přijde lehce méně naléhavá. Navic koukam, ze jsem blbe cetl -- neni to o "levnem" reallocu, ale reallocu jako takovem. Takze chapu tim min, realloc by na uzitecnost marusky nemel mit vliv.
    XCHAOS
    XCHAOS --- ---
    ANT_39: no ano. víceméně, před tím rokem nebo kdy debata vyhnila na tom, že se všichni podivovali, proč nepoužiju prostě pole pointerů na cokoliv (stringy, objekty). namítl jsem, že takto jsem kdysi implementoval např. textový editor kdysi v 16ti bitovém DOSu, a že problém je nemožnost jednoduše "nafukovat" to základní pole pointerů. a dostal jsem (poměrně chytrou) odpověď, že realloc() na současných architekturách je výrazně efektivnější: tedy, musel jsem připustit, že "array is not dead" (i Pythoní seznamy jsou implementované jako obyčejná pole pointerů na objekty, když jsme u toho... nebo byly, když jsem se naposledy snažil podívat do zdrojáků)

    jinak setřídit spojový seznam je fakt hračka: tohle je o těch "seek-ahead" indexech (v podstatě každý prvek seznamu nemá jen pointer "next" ale ještě pointer "seek" - když tohle prohledáváš, vždycky se nejdřív ptáš na this->seek->key a teprve potom na this->next->key: prohledávání je triviální úloha, netriviální je jen postupný růst této struktury během přidávání prvků... počínaje tím prvním)
    ANT_39
    ANT_39 --- ---
    XCHAOS: Ja si teda nepamatuju, jak presne to melo fungovat, ale pripada mi to dost jako sorted linked list, nebo neco takovyho. Cili vec, ktera by mela byt uzitecna nezavisle na tom, jestli jsi schopen realokovat spojity bloky pameti (pole).
    XCHAOS
    XCHAOS --- ---
    (ono je totiž relativně jednoduché udržet tu strukturu +/- někde mezi tou ideální logaritmickou složitostí a N/2, pokud jsou data na vstupu dostatečně náhodná: ale jakmile jsou nějak nevhodně setříděná, tak to strašně snadno zdegeneruje... tudíž kdyby tam tu náhodnost člověk dostal "zvenčí", i pro setříděná data na vstupu, tak by to mohlo pomoct...)

    jako už asi rok jsem to zase nechal bejt, přiznávám, že jsem hodně línej.
    XCHAOS
    XCHAOS --- ---
    DAVIDOWITCH: já se víceméně spokojil s myšlenkou, že bych z asi 3 přímočarých "reindexovacích" operací, které lze při vložení prvku provést, vždy nějakou vybral náhodně :-) ale zatím jsem to nezkusil implementovat.

    (náhodná volba bývá při sestavování datových struktur používána kupodivu docela často...)
    DAVIDOWITCH
    DAVIDOWITCH --- ---
    XCHAOS: Na zvetsovaci pole bacha, v momente kdy udelas resize a nemas za nim dost mista, tak se v O(N) prekopiruje. To je duvod proc se vzdycky zvetsuje na nejakej nasobek a ne o konstantu. Pocita se s tim ze "vyrosteni" trva O(N). A pri tom nasobeni to furt ma amortizovanou slozitost O(1) na insert.

    Ja mel pocit ze problem s timhle stromem byly, ze potrebujes oracle co ho sestavi, bo sme zatim na vsechno vymysleli protipriklad kterej to rozvazi. (A mam dojem, ale tim uz si nejsem jiste, ze nekdo zkousel formalni dukaz proc to nemuze fungovat)
    XCHAOS
    XCHAOS --- ---
    (a BTW, podobně úchylnými datovými strukturami se lidé zabývají a ne že ne.. když mohou existovat skip-listy a podobné zvrhlosti, proč ne tohle ?)
    XCHAOS
    XCHAOS --- ---
    QUICK: Binární B+ strom by byl velmi zhruba tohle:



    ...celý problém je, že bych ho chtěl umět sestavit vždycky +/- ideálně oindexovaný - ale současně bez použití rekurzivně volaných funkcí (když bude ideálně oindexovaný, bude prohledávatelný s log2(N) složitostí). ve skutečnost - od té doby, co umím "zvětšovat pole", mě už potřeba téhle datové struktury přijde lehce méně naléhavá, ale stejně - měla by spoustu pěkných vlastností, kdyby jí šlo jednoduše vytvořit (přesněji: kdyby šlo JEDNODUŠE udržet konzistenci toho indexu při přidání jednoho prvku kamkoliv)
    XCHAOS
    XCHAOS --- ---
    QUICK: přesněji řečeno: poloodborný a polozábavný (tady jsou lidé hákliví na nepřesné definice! zvláště někteří...)

    Binární B+ strom je současně binární a současně B+. ale není to tak docela strom. někde v historii by měl být dokonce nakreslený...
    REDGUY
    REDGUY --- ---
    XCHAOS: Coz nebudu po technicke strance vubec rozebirat. Smyslem bylo nazorne demonstrovat, ze tvoje teorie "sak my uz se nejak domluvim, sme prece lidi ne a tyhletcty odborny akademicky termity vlastne nepotrebujeme" je, mirne receno, mylna. Ale ocividne se to, jiz tradicne, minulo ucinkem 8)

    ale každopádně se mu neříká Maruška. coz neni pravda. Vim aspon o trech, mozna i vice lidech, ktery tvemu algoritmu Maruska rikaji 8) (to ze jsi ho nikdy nedokoncil na veci nic nemeni 8) )
    QUICK
    QUICK --- ---
    Ja to tady rad sleduju, je to jeden z mala odborne/neodborne zabavnych klubu :) Dik za smartpointry a refcount.

    Ale jak vypada teda ten binarni b+ tree? Ja si pamatuju, ze lidi od nas litali od zkousek se zjistenim, ze b-tree opravdu neni binarni strom. Tak jak se daji zkombinovat a co z toho?
    XCHAOS
    XCHAOS --- ---
    REDGUY: ok, ale "binární B+ strom" je velmi speciální případ B+ stromu. Současně to vůbec nevypadá jako binární strom, když jsme u toho. Možná se ten pojem dokonce ani nepožívá, ale každopádně se mu neříká Maruška.
    REDGUY
    REDGUY --- ---
    XCHAOS: přínos takovéhle debaty mi přijde téměř nulový, sorry. lidi, co mají vůli ke spolupráci, a nestojí jen o to honit si ego, by situaci pochopili po prvních několika příspěvcích (za současného navržení upřesnění použité terminologie). - LOL. Delal jsi nekdy na nejakem vetsi projektu s vic lidma?
    Normalni clovek: A tohle udelame pomoci B+ stromu.
    XChaos: Oukej, jasne.
    [ uplyne nekolik tydnu ]
    Normalni clovek behem code review: W. T. F!?!?!?!?!??!?!
    REDGUY
    REDGUY --- ---
    XCHAOS: tak o vzájemné interakci přemýšlet FAKT nemusíš: buď si to alokoval jedním způsobem, nebo druhým - Takze budu mi pro alokaci pameti dva ruzne, nezavisle systemy? To ti prijde prakticke? U kazde funkce si pamatovat, jakym zpusovem alokovala pamet na vysledky co vraci? A co kdyz zmenim implementaci funkce, takze misto forget/remember bude muset pouzit malloc? Budu muset prepsat vsechny mista v kodu kde se ta funkce pouziva a kdyz na jedno misto zapomenu, tak se to rozbije? To ti opravdu prijde prakticke a pouzitelne v jakemkoliv netrivialnim projektu?
    XCHAOS
    XCHAOS --- ---
    DAVIDOWITCH: ano, měl jsem párkrát co do činění s lidmi, kteří dělali doktorát :-) řekl bych, že jde o proces, na jehož konci budou vědět "všechno o ničem" - resp. většinou je to opravdu hodně úzce specializované, že.

    věz, že většina lidí kolem tebe, se kterými se budeš setkávat, v libovolném oboru, nebude tak úzce specializovaná, jako jsou specializovaní doktorandi. a nebudou se vyjadřovat tak přesně, jak je zvykem na akademické půdě, apod.

    zásadním nedorozuměním by přesto bylo dobré předcházet, to je fakt.
    XCHAOS
    XCHAOS --- ---
    Nebo ještě pro upřesnění: smart pointer si představuji jako speciální objekt, jehož destruktor obsahuje volání metody odkazovaného objektu pro snížení počtu evidovaných referencí (a případně - diskutabilně - i volání nějakého pokusu o provedení správy paměti - možná podle velikosti objektu který byl uvolněn, nebo v závislosti na tom, jestli ten počet referencí klesl na 0, apod.)

    To je všechno fajn - ale chápeš, že ve většině ostatních jazyků kromě C++, které použijí refcounty, toto bude přímo nativní forma implementace VŠECH referencí na VŠECHNY třídy objektů: tedy, je to jakási dost C++ specifická berlička, o které uživatelé většiny vyšších jazyků prostě netuší, že to jejich jazyk má pod kapotou - zatímco u C++ si můžeš vybrat, jestli to pod tu kapotu namontuješ, nebo ne.
    XCHAOS
    XCHAOS --- ---
    DAVIDOWITCH: ale já jsem nemyslel smart pointery :-) mimo C++ se prakticky nevyskytují a tohle není klub o C++

    a z toho, co jste mě o tom donutili si nastudovat, jsem přesvědčený, že automatické udržování počtu referencí na objekt je něco jiného, než smart pointery.
    Kliknutím sem můžete změnit nastavení reklam