• ú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: jednoduše se paměť uvolní na konci programu - asi jako když použiješ malloc() bez free() :-) (jak myslíš, že teď kompiluju ty svoje testovací progámky, když kontexty ještě nemám hotové ? :-)

    takhle, jestli mi to přijde jednodušší... kdysi dávno mě C okouzlilo právě tím malým množstvím základních stavebních kamenů. teď mi ale přijde, že některé stavební kameny tam poněkud chybí... samozřejmě jsou lidi, co si radši všechno DIY stylem poslepují sami z deseti instrukcí a dvaceti kanonických knihovních funkcí, a jsou lidé, kteří nemají problém naučit se nějakých 200-300 příkazů a předdefinovaných funkcí v nějakém vyšším jazyce, s tím že ty knihovny pak "všechno dělají za ně" - a oni se mohou tvářit, že všechno dělají sami.

    někdo vozí auto do servisu, někdo si je schopen většinu základních závad opravit sám - co víc k tomu chceš slyšet ? není důvod, proč by to v případě psaní kódu mělo být jinak: někdo to poslepuje z prefabrikovaných kompenent, a je spokojen, jak to vyřešil, někdo jiný zase chce rozumět úplně všemu a do detailů vše řešit sám.

    já nikoho nesoudím, pouze cílím na "šedou zónu" mezi těmito dvěma extrémy.
    REDGUY
    REDGUY --- ---
    XCHAOS: Pred tim nez pouzijes some(typ, parametry) můžeš clenit kod na forget/remember bloky, aby si označil, které kontexty mají a které nemají být uvolněny. - co to? Pokud nepouziju cleneni na forget/remember bloky, jak bude fungovat uvolneni nepotrebne pameti alokovane pres some?

    Nicmene, to podstatne jsi nezodpovedel - prijde ti to jednodussi nez dve pravidla a nezmrzacene C pri pouziti normalniho malloc/free? Kde presne je vyhoda, ziskana tema plus minus ctyrma pravidlama navic? (uplne nechavam stranou drobnost, ze escape je zatim jen jiskrou v tvem oku bez naznaku implementace, stejne jako try/fail/except, jejichz soucasna implementace je rozbita uplne stejne jako setjmp/longjmp)
    XCHAOS
    XCHAOS --- ---
    REDGUY: ok

    Co se musi naucit zacatecnik pouzivajici můj alokator?

    * V nekterych pripadech se pamet alokuje pomoci some(typ, parametry) , v ostatnich pripadech pomoci the(typ, parametry). Pravidlo pro rozliseni techto pripadu je jednoduché a stručné a je podobné pravidlům pro použití určitého a neurčitého členu v angličtině. some(typ, parametry) alokuje paměť pouze v aktuálním kontextu, the() jí alokuje zcela nezávisle na čemkoliv.
    * Pamet alokovana pomoci the(typ, parametry) se musi uvolnit pomoci free().
    * Pamet alokovana pomoci some(typ, parametry) se uvolnovat nemusi.
    * Pred tim nez pouzijes some(typ, parametry) můžeš clenit kod na forget/remember bloky, aby si označil, které kontexty mají a které nemají být uvolněny.
    * Pokud použiješ upřesňující forget/remember, tak zapomen na prikaz return zevnitř jejich scope.
    * Pokud jsi cetl nejakou knihu o normalnim C, nezapomen ze break/continue se v nekterych pripadech chovaji jinak nez bys cekal. Toto lze řešit tím, že se místo break napíše escape
    * goto a setjmp/longjmp is right out.Místo toho je k dispozici struktur try { fail() } except() { } vzdáleně podobná C++, Javě nebo Pythonu, která jejich funkčnost plně nahrazuje, a fail() řeší uvolnění zdrojů scope podobně, jako escape.
    REDGUY
    REDGUY --- ---
    XCHAOS: ano, je to strawan fallacy, čekal jsem, že to řekneš. - co je horsi? Clovek ktery pise nesmyslne argumenty protoze si neuvedomuje jejich nesmyslnost, nebo trouba ktery si to uvedomuje a _presto_ je pise?

    samozřejmě - tohle není strawman fallacy - to je prostě můj soukromý odhad - jisteze neni. To je ad hominem.

    nezlob se, ale tvoje příspěvky tak trochu vyznívají - že "postaru" je to vždycky dobře, a "novátorství" je k ničemu dobré. - jasne. To ze jsem ti napsal hned nekolik zpusobu jak napsat Cll1 tak aby fungovalo je "odpor k novatorstvi" 8))
    REDGUY
    REDGUY --- ---
    XCHAOS: dyž použiješ jakoukoliv externí knihovnu ve svém C projektu, tak by sis asi měl přečíst dokumentaci - nevim o zadne knihovne pro C, ktera by v dokumentaci rikala "A mimochodem, kdyz pouzijes tuhle knihovnu, _nesmis_ pouzivat return uprostred funkce a break/continue se zacne chovat jinak nez jsi zvykly". Knihovny _rozsiruji_ jazyk, ne ho meni, lepe receno v tvem pripade spis mrzaci.
    XCHAOS
    XCHAOS --- ---
    REDGUY: ano, je to strawan fallacy, čekal jsem, že to řekneš.

    nezlob se, ale tvoje příspěvky tak trochu vyznívají - že "postaru" je to vždycky dobře, a "novátorství" je k ničemu dobré. počítám, že v 70tých letech by si asi nebyl v té vlasaté partičce, co vymýšlela Unix a C - a místo toho by si byl vášnivý obhájce Fortranu nebo Cobolu... (samozřejmě - tohle není strawman fallacy - to je prostě můj soukromý odhad :-)
    REDGUY
    REDGUY --- ---
    XCHAOS: Neptam se co je prinosem pro me, ale pro uzivatele na ktere miris. A opravdu bych rad abys v tehle souvislosti odpovedel na [ REDGUY @ ANSI C/C99 (specifikace), GNU C (gcc, glibc), Tiny C (tcc) a POSIX - ne nutně C++,g++,libstdc++ nebo Win32 API ] , v tehle souvislosti je to velmi dulezita otazka.
    XCHAOS
    XCHAOS --- ---
    REDGUY: no tak co začne jako nástroj pro mikroprojekty, to se může v budoucnu rozvinout... vezmi si takové PHP :-)

    podívej, když použiješ jakoukoliv externí knihovnu ve svém C projektu, tak by sis asi měl přečíst dokumentaci: jak to incializovat, jak deinicalizovat, jaké jsou chybové stavy, jak je ošetřit, a v neposlední řadě - jak to používat. a typicky okopíruješ fragement nějakého ukázkového kódu. viz např.: http://www.metalshell.com/source_code/18/Mysql_Select.html

    a teď mi řekni, proč by si někdo, kdo použije makro for_each() neměl nejdřív přečíst dokumentaci - stejně, jako si jí musí přečíst, když použije nějakou jakoukoliv jinou knihovní funkci, kterou napsal někdo jiný. dílem budou lidé asi více používat méně známé či frekventované instrukce, jako třeba "continue", dílem budou používat "escape" místo profláklého "break". to bude zdokumentované. stejně, jako zdokumentované, jak přistupovat z C k MySQL databázi.

    souhlasím, že nezdokumentované chování je velká chyba a musí být vymýceno. pokud ale všechny ty "nedomyšlenosti" (na které hodně předem a dost vášnivě upozorňuješ, ale často i máš pravdu). myslím, že pokud tě můj projekt tak moc zaujal (jak tě evidentně zaujal), tak budeš mít určitě příležitost porovnávat zdoukumentované a skutečné chování, a jistě najdeš spoustu "špeků", se kterými jsem ve své idealistické naivitě nepočítal.
    REDGUY
    REDGUY --- ---
    XCHAOS: proč se jeho hlavní náplní stalo dokazování, že snaha o rozvoj C jiným směrem, než k Objektive C/C++ je URČITĚ (a za všech okolností a pro všechny) špatná ? - lekce zdarma - _TOHLE_ je strawman fallacy. Nikdy nikdo tady nerikal, ze rozvoj C jinym smerem nez OC/C++ je urcite spatne a myslim ze to moc dobre vis. Jen o par zprav dozadu jsem ti ukazoval jake nastroje k rozvijeni C tim jinym smerem muzes pouzit misto zoufale nevhodneho Ceckoveho preprocesoru.
    XCHAOS
    XCHAOS --- ---
    REDGUY: víceméně, pokud pro tebe nebude přínos žádný, tak se to dá i docela dobře pochopit.

    nešlo by to prostě dohodnout tak, že tento klub je obecně o C a o věcech volně souvisejících s C ? proč se jeho hlavní náplní stalo dokazování, že snaha o rozvoj C jiným směrem, než k Objektive C/C++ je URČITĚ (a za všech okolností a pro všechny) špatná ?
    REDGUY
    REDGUY --- ---
    XCHAOS: je to pak prostě už "trochu jiný jazyk", stejně jako ObjectiveC je jiné, stejně jako C++ je jiné - ano. Jenomze Jak ObjC tak C++ jsou _univerzalni_ jazyky ve kterych muzu psat projekty vsech velikosti. Zatimco o Cll1 jsi ty sam napsal, ze je urcene na "mikroprojekty". Takze plan je takovej, ze na male veci budu pouzivat Cll1, ktere je _skoro_ C, ale ne uplne a nektere konstrukce z C ho spolehlive a hlavne bez varovani rozbijou, zatimco kdyz budu delat neco vetsiho, pouziju C? To bude zabava, pri prechodu z velkeho projektu na malej bastl si vzpomenout, co vsechno je v Cll1 rozbite a naopak, pri prechodu zpatky si uvedomit, ze ty obezlicky, nutne aby Cll1 fungovalo, uz nejsou zapotrebi.
    REDGUY
    REDGUY --- ---
    XCHAOS: jednoduše udělám jako "manuál" velkou tabulku všech svých maker, u kterých bude zmíněná jejich "kompatibilita" s break, continue, goto a return - takze soucasti jednoducheho, rychleho nastroje pro mikroprojekty urceneho pro zacatecniky (chapu to spravne?) bude velka tabulka ad-hoc nekompatibilit s normalnim C, kterou bude potreba se ridit protoze jinak se to rozbije? To ti prijde jako zjednoduseni? Co presne je podle tebe prinosem?
    XCHAOS
    XCHAOS --- ---
    REDGUY: když "víš co děláš", ano... ale ty prostě vycházíš z toho, že lidé co žádný toolkit nepoužití, _vždycky_ "vědí co dělají" - zatímco lidé, co ho použijí, _nikdy_ nevědí, co dělají.

    to ovšem není tak docela pravda - stejně jako můžeš zdokumentovat, že u open() je chybový kód filedescriptor<0 , zatímco u fopen() je to FILE==NULL, a lidi se to musí naučit, tak stejně tak programátoři v C<<1 si budou muset v dokumentaci přečíst, že místo break můžou univerzálně používat makro escape (v případech nespecializovaných smyček to udělá prostě break a basta). ano... je to pak prostě už "trochu jiný jazyk", stejně jako ObjectiveC je jiné, stejně jako C++ je jiné...
    XCHAOS
    XCHAOS --- ---
    REDGUY: tak zrovna to for_each() se chová slušně korektně pro continue; ... horší je to s break.

    uznávám, že např. nezavřený soubor při break; je nedomyšlenost (i když podle mě nikoliv neřešitelná). (ne všechny moje iterátory ovšem otevírají nějaký soubor...). tady by asi bylo nutné nějaké "escape", které by dělalo "přesně tu správnou věc" pro každé iterační makro.

    jednoduše udělám jako "manuál" velkou tabulku všech svých maker, u kterých bude zmíněná jejich "kompatibilita" s break, continue, goto a return. Nekompatibilitu s break (a v jistém smyslu s goto/return) bude nutné řešit makrem "escape", které bude něco jako "korektní break".

    jako programátor v Céčku jsem strávil mládí řešením, jak správně přečíst a pak zase zapsat textovej soubor s přesně správným počtem prázdných řádků na konci (typicky jeden nebo žádný). sice to je zajímavé intelektuální cvičení pro začátečníky - ale dost nesouhlasím s tím, že by toto nutně museli všichni znova podstupovat od začátku, a že by na to nešlo napsat nějaké triviální univerzální řešení po vzoru vyšších jazyků... ano, dost velký opruz zůstane hlídání vyjímek, alokací paměti, apod. - už skrze to to nikdy nebude "vyšší" jazyk... samozřejmě.
    REDGUY
    REDGUY --- ---
    XCHAOS: takhle, snad jsme se shodli, že možnost nevhodného použití returnu lidmi, co nevědí co dělají, je obecně VLASTNOST všeho v čistém C - je to chyba koncepce toho jazyka, resp. já to už nijak výrazněji nezhoršuji proti stavu, který je i beze mě. - boha jeho, to je neuveritelny. Tak jeste jednou a pomalu: kdyz vim co delam, _muzu_ return pouziv v C uprostred funkce bez problemu. I kdyz vim co delam, v Cll1 ho tak pouzit _nemuzu_. To je vyrazne _zhorseni_ stavu, _prosim_, prestan uz s timhle blabolem ze "nic nezhorsujes".
    REDGUY
    REDGUY --- ---
    XCHAOS: for_each & spol jsou nejmensim problemem. I kdyz samozrejme predstava ze bych musel nekdy hledat je chyba v #define for_each(ONE_T,ONE,ALL_T,...) for(_init_##ONE_T##_##ALL_T(_head_##ONE_T##_##ALL_T(ONE,__VA_ARGS__));_test_##ONE_T##_##ALL_T(ONE,__VA_ARGS__) || _free_##ONE_T##_##ALL_T(ONE,__VA_ARGS__);_next_##ONE_T##_##ALL_T(ONE,__VA_ARGS__)) je fyzicky bolestiva.

    Kde to zoufale nefunguje je tvoje snaha vytvaret nove struktury v C, ktere proste nejde trivialne namapovat na nejaky for/while. Viz rozbitej return/goto/break/continue, to vsechno kvuli jen napul fungujicim "kontextum".
    XCHAOS
    XCHAOS --- ---
    JACHYMKO: takhle, snad jsme se shodli, že možnost nevhodného použití returnu lidmi, co nevědí co dělají, je obecně VLASTNOST všeho v čistém C - je to chyba koncepce toho jazyka, resp. já to už nijak výrazněji nezhoršuji proti stavu, který je i beze mě.

    ano, tak trochu mám pocit, že pokud by člověk psal opravdu čistě strukturovaný kód, s využitím systému odchytávání vyjímek, tak asi nebude mít až tolik případů, kdy by měl z jedné funkce více returnů:

    1) obecně, pokud je to void funkce a nevrací žádnou hodnotu, tak jí lze nejspíš rozdělit na více dílčích funkcí

    2) ad příklad s tou deinicializací - ona správná odpověď asi je, že toto by se napsalo "C-objektově" - tedy všechny ty lokální proměnné by byly ve struct, a ten de-inicializátor by byla funkce, které se předává pointer na struct a kterou lze zavolat z více míst...

    2) pokud funkce vrací nějaký výsledek, tak skutečně její vnitřní větvení, ukončené různými návratovými hodnotami - včetně nastavení hodnot indikujících chybu, apod. - by se mohla "sbíhat" před místem, kde se vrací ta návratová hodnota. opravdu jsem takto viděl jiné lidi programovat a nemyslím, že je to špatný přístup.
    XCHAOS
    XCHAOS --- ---
    REDGUY: no, v době mých prvních pokusů jsem je skutečně používal špatně - resp. vygeneroval jsem hrozné množství maker, a chtěl jsem dělat jejich speciální verzi pro každý myslitelný datový typ, apod. ... skutečně jsem i sám sebe poměrně rychle přesvědčil, že směřuju do slepé uličky.

    vezmi si ale, že třeba standardizované operace va_start(), va_arg() a va_end() jsou taky většinou (plaform-dependend) implementované jako makra, která jsou VELICE podobná přístupu, který razím já.

    a teď si představ, že bych udělal for_each(int, .., args, ...) {}, for_each(str, ..., args ...) {} ... které by šlo použít u funkcí s proměnným počtem argumentů - ale bylo by to celé daleko čistší ?

    a pokud to moje 4+ argumentové for_each() bude skutečně univerzální pro celou řadu iterací, které jsou v C tak nějak "nakousnuté", ale vlastně se pokaždé dělají jinak ?
    REDGUY
    REDGUY --- ---
    Hele, XChaosi, fakt bych moc rad abys mi odpovedel na tohle, pro jistotu to prikopiruju sem:

    začátečník, kterého budeš učit céčko ty, každopádně nabude dojmu, že z C funkce je možné kdykoliv bez rozmyšlení utéct - nikolvek. Zacatecnik, ktereho budu ucit programovat, se nauci tohle:

    * Pamet se alokuje pomoci malloc
    * Kazdou alokovanou pamet musis uvolnit pomoci free

    Co se musi naucit zacatecnik pouzivajici tvuj alokator?

    * V nekterych pripadech se pamet alokuje pomoci xchaos_alloc, v ostatnich pripadech pomoci malloc. Pravidlo pro rozliseni techto pripadu je "..." (zhruba odstavec textu).
    * Pamet alokovana pomoci malloc se musi uvolnit pomoci free.
    * Pamet alokovana pomoci xchaos_alloc se uvolnovat nemusi.
    * Pred tim nez pouzijes xchaos_alloc musis spravne clenit kod na forget/remember bloky
    * Pokud jsi cetl nejakou knihu o C, tak zapomen na prikaz return jinde nez na konci funkce.
    * Pokud jsi cetl nejakou knihu o normalnim C, nezapomen ze break/continue se v nekterych pripadech chovaji jinak nez bys cekal.
    * goto a setjmp/longjmp is right out.

    Zapomel jsem na neco? Co ti prijde jednodussi?
    XCHAOS
    XCHAOS --- ---
    JACHYMKO: asi taková, jako že tebe "donutím" začít vyvíjet céčkové aplikace pro Linux, místo pro mikrosoftí platformy ?
    REDGUY
    REDGUY --- ---
    XCHAOS: vidím, že si konečně vzal na milost makra Ach jo. Psal jsem nekdy ze obecne pouzivat makra je spatne? Nepsal. Psal jsem, ze spatne je zpusob jakym je pouzivas ty.

    že si uvědomuješ závažnost problému s random-return z plain-C funkce - dtto. Ano, je potreba uvolnovat zabrane zdroje. V C to jde (kdyz na to clovek mysli) i pri pouzit returnu uprostred funkce, v tvem bastlu return uprosted pouzit nemuzes vubec.

    velká spousta programátorů tento problém řeší tím, že k úniku z funkce používá místo tebou navrhovaných maker např.nějaké goto na deinicializační blok.... fakt jsem to takto viděl už mnohokrát. - LOL. Jeste nedavno jsi psal, ze, cituji "v C [se] doporučuje použít goto max. jen na ošetření chyb (s následným rychlým ukončením programu, pokud možno)". Tak jak to je? Prosim, pokud uz si s prstu cucas ucelove argumenty podle toho co zrovna potrebujes, _prosim_, aspon si je pamatuj a bud konzistetni. A btw, samozrejme ze pouziti goto tak jak ho tady popisujes problem tvych "kontextu" neresi, protoze je rozbije uplne stejne jako return.

    Nicmene, psal jsi neco o milionu zpusoby kdy i v normalnim C nelze pouzit return uprostred funkce. U jednoho jsem ti ukazal jak na to, takze bych prosil nejaky dalsi z tech zbylych 999 999?
    Kliknutím sem můžete změnit nastavení reklam