| |
 |
|
 |
|
POZOR! Tento článek byl naposledy aktualizován před více než dvěma lety!
Je možné, že následující stránka obsahuje odkazy, které dnes již nejsou funkční,
nebo že některé informace uvedené v tomto článku se v průběhu času ukázaly jako
prokazatelně chybné. Pokud jakoukoliv podobnou závadu zjistíte, tak neváhejte
napsat co nejpřesnější popis závady do veřejného komentáře pod článkem: redakce
TečkyCZ nové komentáře neustále sleduje, a to i pod těmi nejstaršími články.
V celé řadě případů lze chyby snadno opravit - např. se stává,
že video na YouTube bylo smazáno a znovu nahráno pod jiným id. V jiných případech
někdo zase zakáže embedovaní videa, která přitom existuje ve více kopiích, nebo se
z webu ztratí stránka umístěná na negarantovaném freehostingu, zatímco původní autor stránek
si mezitím zaregistruje vlastní doménu, atd.
Děkujeme všem, kteří pomáhají opravovat chyby ve starších webových stránkách a
udržují tak Internet naživu - redakce TečkyCZ.
Učebnice jazyka C<<1 - 1.částxChaos 13. dubna 2003 [16430 znaků] [editováno 17. března 2006] [HowKnow]
★ [ + ] 1 [3x] [ - ] [ neaktuální[x]] Zobrazení 25844 ← Facebook 7 Twitter 18 Google 44 Komentářů 24
V čem by vlastně v roce 2003 bylo vhodné programovat ? Nejsem příznivcem objektového programování a možnosti skriptovacích jazyků se mi zdají omezené - na druhou stranu mě nikdy nebavil assembler a tělocvik, který je třeba v jazyce C provádět s pointery.
Pokud disponujete překladačem jazyka C, zkuste si následující příklad:
int main(void) { printf("2<<1=%d\n", 2<<1); }
(pro začátečníky v jazyce C a např. Linuxu: uložte si příkaz například do souboru
test.c, přeložte příkazem make test a spusťte jako ./test).
Myslím, že na tomto příkladu je jasné, čím se programovací jazyk C<<1 liší od jazyků C++, C-- (ano, i ten existoval), nebo dokonce C## (nevím jak vám, ale mě to dělá "syntax error at '##' token" - nevím, co tím chěli v Microsoftu říct... :-)
Proč vůbec hledám nový programovací jazyk ?
Od té doby, co jsem dokončil Arachne, (grafický webový prohlížeč pro DOS) jsem toho po pravdě řečeno moc nenaprogramoval. Potřeboval jsem nějaký čas na zotavení ze speciálního manažeru virtuální paměti, který umožňoval v (tuším) reálném módu operačního systému DOS adresovat místo 640 KB ccca 3-4 MB (podle nastavení některých parametrů), který využíval buď disk, EMS nebo XMS přesuny, a jehož handlery měly pouhých 16 bitů délky. Jak jsem se pak dozvěděl, tak systém který jsem vytvořil, nebyl zcela nepodobný tomu, jak se programovalo ve starších verzích systému MacOS. Jistě uznáte, že používat něco podobného pět let a neskončit v blázinci se mi povedlo pouze čirou náhodou :-)
Dalším důležitým požadavkem v open source éře je čitelnost zdrojového kódu pro běžného uživatele. Bohuže, je celkem k ničemu, pokud je určitý systém open source, pokud letmý pohled do zdrojového kódu odhalí nutnost nejprve nastudovat tisíce předdefinovaných tříd objektů, datových typů, konstant a procedur. Otevřený zdrojový kód by podle mého názoru měl být samodokumentující - každých několik řádek by mělo jasně vypovídat o tom, k čemu jsou vlastně v programu dobré.
Už delší čas se zaobírám myšlenkou programovat místo jazyka C v něčem jiném. Řešil jsem některé možné alternativy:
Skriptovací jazyky PHP nebo Perl - ano, obsahují spoustu zajímavých nápadů, webové aplikace samozřejmě bastlím v PHP a MySQL - ale nezlobte se, tomu se nedá říkat programování! A jako by to nestačilo, v poslední době jsem se dokonce přistihl, že píšu delší a delší shellové skripty (/bin/bash), a dokonce si už do nich dělám i komentáře ! Ano, skriptované aplikace mají některé geniální výhody, zejména při zpracování textových řetězců, které kompilované jazyky většinou nemají - námatkou indexování polí řetězci, které mi přijde jako docela elegantní řešení řady problémů. Ale v zásadě pro mě skriptovaná aplikace není skutečným programem - ani náhodou nevede k efektivnímu využítí prostředků počítače. Pokud se skript startuje jednou, při bootu systému, tak se to snad dá pochopit - ale já se koneckonců nechci stát systémovým programátorem...
Java - tomuto jazyku se vyhýbám širokým obloukem. Proti firmě Sun vůbec nic nemám, ba právě naopak - myslím, že licencovat multiplatformní StarOffice a uvolnit její zdrojový kód jakožto OpenOffice.org byl výborný nápad, který jednou historici informatiky zhodnotí jako poslední hřebík do rakve Microsoftu. Ale Javu prostě používat nechci . Důvodů je několik, ale stručně řečeno: podle mě Java spojuje nevýhody objektově orientovaného programování, uzavřeného zdrojového kódu a skriptovavích jazyků. O jazyce C## pro Microsoft.NET pak už nechci slyšet vůbec - a to ani o jeho mutaci MONO. Prostě ne. (A chci vidět, jak některá z těch Java her v mobilních telefonech bude bez jakéhokoliv zásahu fungovat třeba jako applet ve webovém browseru... )
Objektové C++ - nemám rád objektové programování, tudíž nemůžu mít rád ani C++. Důvody jsou čistě subjektivní, ale celkově souvisí s mým přístupem k životu a práci: chci jazyk, který mi z několika základních, volně dostupných součástí umožní postavit cokoliv. Objektové programování naopak vede k tomu, že se musím prodírat obrovskými knihovnami předpřipravených tříd, učit se jejich syntaxi, apod. Nezlobte se - ale to už jsem rovnou mohl dostudovat vysokou školu, kdybych chtěl programovat objektově...
ANSI C - jenže programovat dnes korektně v jazyce C se až nepříjemně podobá objektovému programování. Viz rozdíly mezi toolkity Gtk+ a Qt, ve kterých se dnes píší grafické aplikace pro Linux. Nevidím žádnou "výhodu" při použití toho stylu programování v C, ve kterém jsou psané Gnome aplikace nebo třeba Mozilla: sice se není potřeba učit různé syntaktické ztřeštěnosti, které jsou běžné v C++, ale stejně je třeba nastudovat tolik různých předdefinovaných konstant, knihovních funkcí, apod., že člověk ani po několika hodinách experimentování nemá funkční program, naštve se, a jde od válu.
Teď jsem zhruba vyčerpal všechny dnes běžně používané možnosti, jak sobě něco naprogramovat. Zbývají ale ještě dvě cesty:
Napsat si vlastní programovací jazyk. Tato možnost obvykle vede do temných bažin šílenství, ale přesto jsem jí zcela nezavrhl; přesunul jsem ji ovšm někam na seznam čiností, kterým se budu věnovat buď v důchodu, nebo pokud se někdy do té doby stanu finančně zaopatřeným mužem v domácnosti, který by měl spoustu času na hraní :-) Každopádně kdybych nějaký jazyk vymýšlel, asi bych ho udělal univerzální, a použitelný jak pro skriptování či práci pomocí příkazové řádky (konzole, URL), tak i pro kompilování binárních aplikací. Jako nejschůdnější možnost se mi jeví interpretr, který by zároveň byl schopný fungovat jako prekompiler, generující přeložitelný a multiplatformní ANSI C zdrojový kód.
Naučit se používat programovací jazyk C takovým stylem, který by umožňoval psát všem snadno srozumitelný a přehledný kód. Tím směrem se nakonec asi vydá většina těch, kteří se rozhodnou nepoužívat C++. Jazyk C<<1 je snahou vytvořit jakousi "sbírku vychytávek", která umožní programovat v obyčejném céčku jednoduše a přehledně.
Obecný jazyk C je možné používat stejně jako běžný mluvený jazyk různými styly. Stejě jako v češtině někdy řeknete "okno" a jindy "vokno", a všichni vám rozumí, tak je možné používat dialekty i v programovacích jazycích. Já pochopitelně chci programovat tak, abych mohl v připadě potřeby použít i "sprostá slova" (například instrukci goto :-)
C<<1 a logické proměnné
Logické neboli boolovské proměnné jsou úplně zbytečné - číselná hodnota 0 je FALSE, hodnota 1 TRUE, pokud chceme šetřit paměť, můžeme použít bitovou mapu. Skutečně nechápu, proč jsou české vysoké školy zamořeny tolika stoupenci programovacího jazyka Pascal s jeho TRUE a FALSE hodnotami.
Součástí specifikace C<<1 je samozřejmě:
#define TRUE 1
#define FALSE 0
#define not !
Sice to může učinit program čitelnější pro začátečníky, ale já jsem si na používání vykřičníku (!) pro zápis operátoru NOT natolik zvykl, že bych zápis if(not cosi) asi spíš nepoužíval. A jak už jsem napsal - proč vlastně používat TRUE a FALSE v době, kdy význam logické jedničky a nuly znají i děti v mateřských školkách... fakt nevím. Raději bych to nechal Pascalistům. Je ale pravda, že použít u nějaké proměnné možné hodnoty 0 a 1 svádí k tomu přidat tam potom i 2, 3 ... a pro mimořádně vznosné a reprezentativní pasáže programu to může mít dekorativní význam - například, když chceme napsat do license.h:
#define GPL_LICENSED_CODE TRUE
:-)
Rozhodně je ale doporučená forma zápisu v C<<1 spíš if(neco), if(!neco), nez if(neco==1) ci if(neco==0).
C<<1 a spojové seznamy
Spojové seznamy bývají oblíbeným základním kamenem různých objektových i neobjektových knihoven. Jazyk C<<1 značně usadňuje práci se spojovými seznamy libovolných datových struktur následujícími deklaracemi:
#include <string.h>
#define create(A) (struct A *)malloc(sizeof(struct A))
#define insert(A,B) { A->next = B ; B = A ; }
#define every(A,B) for( A = B ; A ; A = A->next)
#define search(A,B,C) every(A,B) if(C)
#define remove(A,B,C) \
{void **D=NULL; every(A,B)if(C){if(D)*D=A->next; else B=A->next; free(A);} \
else D=(void *)&(A->next); }
#define drop(A,B) { for( A = B ; A ; B = A, A = A->next, free(B)); B=NULL; }
Tiše předpokládáme, že každá datová struktura kterou chceme spojovat do seznamu má položku next, která je pointerem na strukturu stejného typu.
Příklady:
struct Zaznam
{
char *buf;
struct Zaznam *next;
} *zaznamy=NULL, *zaznam;
Potom můžeme pracovat se spojovým seznamem poměrně elegantně například následujícim způsobem:
zaznam=create(Zaznam);
insert(zaznam,zaznamy);
every(zaznam,zaznamy) puts(zaznam->buf);
search(zaznam,zaznamy,!zaznam->buf) { puts("Invalid record found!"); break; }
search(zaznam,zaznamy,zaznam->buf && zaznam->buf[0]!='#')puts(zaznam->buf);
remove(zaznam,zaznamy,zaznam->buf && zaznam->buf[0]=='#');
search(zaznam,zaznamy,zaznam->buf && count++<10) puts(zaznam->buf)
drop(zaznam,zaznamy);
Vyznavači jazyka SQL by určitě ocenili, kdyby se místo search() mohlo psát
select() - jenže select() je bohužel knihovní funkce libc pro monitorování
otevřených filedeskriptorů. To naštve, podobně jako zjištění, že ani při nejlepší vůli nelze jednoduše psát SQL dotazy jako parametry shellového skriptu, protože * prostě v shellu expanduje, a musela by se quotovat jako \* ... :-(
Stejně místo new() a delete() používaného v C++ jsem se rozhodl raději pro
označení create() a remove() - ostatně, nikdo neříká, že rozšíření C<<1 a C++ se mají záměrně vylučovat...
Každopádně si povšimněme, jak můžeme pomocí jediného break elegantně říci makru search(), zda má vypsat pouze první nalezený, několik, nebo všechny
záznamy. Řekl bych, že komfort zápisu se už blíží jazykům Prolog nebo SQL.
Makro remove() vypadá sice krkolomě, ale když se nad tím zamyslíte, funguje zcela spolehlivě - nevěřící si to mohou vyzkoušet sami, já to taky radši udělal... (BTW, jestli někoho napadá, jak remevot implementovat bez toho jednoho pointeru D navíc - samozřejmě jako makro s třemi parametry, ne jako funkci nebo se čtyřmi parametry! - tak má u mě konektivitu v rámci czFree nebo webhosting zdarma ... já se s tím trápil asi hodinu a jinak jsem to nevymyslel ;-)
Samozřejmě, tenhle přístup svádí k domu definovat ještě nějaké search_first(A,B,C) a search_limit(A,B,C,N) - jenže to bychom pak zase vytvořili
knihovnu, ke které je potřeba psát tisícistránkový manuál, jako třeba k SQL.
Kdo je hračička, napsal si podobných nástrojů jistě už v životě dost - nás zajímá, aby náš open source kód byl na první pohled čitelný a srozumitelný.
Naopak opačný přístu - tzn. vynechat makro every() a nahradit ho makrem search(A,B,TRUE) - zavání nebezpečným kacířským minimalismem, který tady rozhodně nebudeme trpět! :-)
Poslední makro "drop" je potřeba definovat, protože výraz "every(zaznam,zaznamy)free(zaznam);" by sice byl krásně srozumitelný a většinou by i fungoval - bylo by to ale už poněkud moc přidrzlé - ve chvíli kdybychom se odkazovali na zaznam->next, by už záznam byl dealokovaný. A to by bylo ošklivé.
C<<1 a smyčky
S revolučním způsobem, jakým lze pomocí maker preprocesoru do jazyka C vnášet nové typy iterací, vás už seznámila makra every() a search() pro procházení spojových seznamů. Osobně jsem jako začátečník kdysi silně postrádal tyto dva typy iterací:
#define loop while(1)
#define iterate(VAR,FROM,TO) for(VAR = FROM ; VAR <= TO ; VAR++ )
... ale na druhou stranu, nemyslím, že by se bez nich nedalo přežít. Každopádně
zápis
do { naveky_veku_prekresluj_kurzor_mysi_a_cekej_na_kliknuti(); } loop;
vypadá celkem srozumitelně - a přitom snižuje nutkavou potřebu použití příkazu goto či jiných neslušných struktur. Smyčka iterate() je pak už jen čirou pomůckou pro zvýšení čitelnosti programu:
int i;
iterate(i,1,3) printf("Bude to hotovy %d\n",i);
C<<1, stringy a pointery
Způsob, jakým se v jazyce C pracuje s řetězci, je velice bolestivý, a nezapře, že autoři jazyka C měli rozsáhle zkušenosti především s assemblerem. Je jasné, že prvotní motivací k napsání C++ bylo právě vytvoření jednoduché náhrady za funkce definované v nešťasntném <string.h> - možná, že kdyby v C existovala obdoba operátoru == pro porovnávání null terminated řetězců, tak mohl být svět dodnes uchráněn hrůz objektově orientovaného programování...
Obejít omezené možnosti práce se stringy jde pomocí maker jen těžko. Já sám se po letech přemýšlení o tom jak by tahle funkce měla být definovaná správně nedostal dál než k poněkud fortranovskému:
#define eq(A,B) !strcmp(A,B)
Pro začátečníka je jistě pochopitelnější, že funkce nabývá pravdivé hodnoty,
pokud se řetězce rovnají - ne vždy přece chceme řetězce třídit podle abecedy,
jak předpokládá strcmp.
Daleko podstatnější je ale eliminovat jiné funkce, a sice strcmp() a strncmp().
Když se nad tím zamyslíte, tak právě tyto funkce, spolu s deklarací řetězců fixní délky jsou hlavní příčinou tzv. buffer overruns, a tím pádem bezpečnostních děr v aplikacích napsaných v céčku.
Vyhnout se kopírování řetězců občas nejde - ale pro nářeří C<<1 bude daleko zajímavější naučit se takovému způsobu uvažování, kdy řetězce nekopírujeme vůbec, a pokud je kopírujeme, tak do bufferu, který jsme naalokovali pomocí maker
#define string(LEN) (char *)malloc(LEN)
#define duplicate(A,B) { B=string(strlen(A)); strcpy(B,A); }
Macro duplicate() záměrně používá opačné pořadí parametrů, než strcpy() - to proto, aby si programátor uvědomil, že vytváří kopii řetězce. Oproti strcpy() duplicate totiž kupodivu zachová i obsah pointerů, které se na řetězec B mohly kdykoliv předtím odkazovat, což může být užitečné. V C<<1 tedy místo drakonicky insecure konstrukcí typu:
{
char a[80], b[10]="ahoj", *ptr=b;
gets(a);
strcpy(b,a);
}
(podotýkám, že ty průšvihy většinou vznikají nezáměrně - nebijí tak brutálně do očí) napíšeme raději daleko čistší:
#define STRLEN 80
{
char *a=string(STRLEN),*b="ahoj", *ptr=b;
fgets(a,STRLEN,stdin);
duplicate(a,b);
}
Kromě zjevného buffer overrunu v prvním příkladu si povšimněte, že v obou případech bude hodnota stringu ptr odlišná - v prvním případě se přepíše hodnotou stringu a načtenou z klávesnice, v druhém případě zůstane string b v paměti, a pointer ptr na něj tím pádem pořád ukazuje, a má původní hodnotu "ahoj". Eliminace staticky deklarovaných řetězců umožňuje používat fixní přiřazování řetězců ve stylu "a=b" daleko častěji.
Nevýhody tohoto systému jsou dvě: jednak ta, že celý systém je poněkud náročnější na využití paměti - ale na to musí už holt myslet programátor - jednak při duplikaci dochází dvakrát k procházení celého řetězce bajt po bajtu, čemuž se příznivci jazyků kde se pracuje pouze se stringy známé délky jistě vysmějí. Klidně se smějte - makro duplicate(), stejně jako funkce strlen(), se v dobře napsaných programech nemusí využívat zas tak často.
Po deseti letech programování v jazyce C je mi jasné, že staticky deklarované řetězce nejsou ospravedlnitelné nikdy, za žádných okolností. Bohužel - pokud
se učíte programovat z vestavěné nápovědy k jazyku Borland C++ 3.1, tak vám může trvat řadu let, které ztrávíte debugováním vašich programů, než vám tato skutečnost dojde :-)
V dalším pokračování se buď pokusím oživit svoje vize na použití C jako skriptovacího jazyka pro WWW stránky, nebo uvedu některé jiné konkrétní případy
objektově neorientovaných prográmků, kterými se v současné době zabývám, které chci uveřejnit jako open source, a za které se zároveň nechci stydět jako za totální bastl.
V ještě dalších pokračováních budeme postupně rozvíjet další "stylová doporučení": pro jednoduché čtení textových souborů, případně pro práce s SQL databází nebo dokonce grafickými tooklity. Pro mě je tvorba učebnice vlasně druhým pokusem naučit se jazyk C - tentokrát s nadhledem, a méně samolibě a živelně.
Sloupcová sazba: pokud je okno prohlížeče dostatečně velké (na monitoru s dostatečným rozlišením),
zobrazí se článek ve více sloupcích (w3.org).
Testováno v browserech Firefox, Opera
a Chrome. Není implementováno v Internet Exploreru.
Tato feature může způsobovat problémy ve starších verzích prohlížečů s jádrem Webkit (Google Chrome, Safari, Konqueror).
Pokud nevidíte článek celý, zkuste zmenšit okno prohlížeče nebo použít verzi pro tisk.
[zpět na začátek sloupcové sazby] Pokud se vám článek líbil, zkuste autora podpořit [zobrazit možnosti] →- moderujte článek kladně (v záhlaví nebo níže) nebo odstraňujte negativní přívlastky, se kterými nesouhlasíte
- moderujte relevantní komentáře kladně (stanou se nedílnou součástí článku) a nesmyslné naopak záporně
- napište pod článek sami pozitivní či přínosný komentář (pokud vím, tak většina autorů na webu má ráda komentáře)
- uvažujte TečkaCZ-kovitě a používejte mikrosyntaxi v komentářích (používejte hashtagy, vkládejte odkazy nebo obrázky...)
- uploadněte si ikonku ke své přezdívce, pod kterou komentujete články [www.gravatar.com] :-)
- staňte se registrovaným komentátorem a moderátorem [COMMING SOON]
- sdílejte tento článek v sociálních sítích a na diskuzních fórech (některé předem připravené možnosti viz níže)
- followujte (sledujte, spřátelte si...) TečkuCZ v sítích [Identi.ca] [Twitter] [Google+] nebo odebírejte [RSS kanál]
- zašlete Bitcoin dar dle vlastního uvážení (např. 0.01-0.1 BTC) na účet [19rriLx8vR19wGefPaMhakqnCYNYwjLvxq] :-)
- zašlete peněžní dar dle vlastního uvážení (např. 1-10 CZK, VS=číslo článku) na transparentní účet [2900242944/2010]
Sdílet v síti [Identi.ca - musíte být předem přihlášeni] [Twitter] [Facebook]
[Jagg.cz] Formátovat pro tisk [bez komentářů]
[s komentáři]
Krátká forma URL (adresy) [http://teckacz.cz/130]
Všechny články [od autora xChaos]
[v rubrice HowKnow] [nejnovější]
Hodnocení článku čtenáři [ + ] 1 [3x] [ - ] Tip: Pro moderaci ÄlĂĄnkĹŻ (kladnĂŠ nebo zĂĄpornĂŠ hodnocenĂ) je nutnĂŠ pouĹžĂt browser, kterĂ˝ podporuje javascript a cookies.
Komentáře čtenářů [napsat vlastní]
hujer 14. dubna 2003 ← komentářů 11 ☯☯ 2 [2x] ★ [ + ] 0 [0x] [ - ] ← pro ohodnocení komentáře se není nutné nikde registrovat
→ [/-/524] ← na komentář můžete odpovědět nebo ho sdílet
Chaosi, proc se tak stitis objektovyho programovani??? Me to prijde pro vetsi projekty a pro veci jako je treba GUI nebo udalostmi rizene programovani proste jedina mozna a pritom naprosto elegantni cesta...
xChaos 14. dubna 2003 ← komentářů 5520 ☯ 0 [3050x] ★ [ + ] 0 [0x] [ - ] ← pro ohodnocení komentáře se není nutné nikde registrovat
→ [/-/525] ← na komentář můžete odpovědět nebo ho sdílet
Prave jsem vymyslel neco lepsiho, tak mi to neber ;-) Pisu ted v C<< QoS skript pro GW Prometheus a daji se v tom delat naprosto krkolomny kousky - zjistil jsem, ze vsechny moje smycky ve vsech programech v zivote byly jenom "every( )" nebo "search( )" ... ;-)
cxl (anonym) 14. dubna 2003 ★ [ + ] 0 [0x] [ - ] ← pro ohodnocení komentáře se není nutné nikde registrovat
→ [/-/526] ← na komentář můžete odpovědět nebo ho sdílet
No, ted kdyz jsem si to precetl cele, proste vynalezas neco, co bylo v C++ pred 15 lety nahrazeno templaty... Ve velice davne historii se v C++ pouzivalo cosi jako vyse uvedena makra, brzo se ale zjistilo, ze na vetsi programy se to proste nehodi, protoze zacnou rychle clashovat jmena. Makra jsou svinstvo, nemaji zadnou scope, nerozlisuji typy. Ze tvuj eq funguje pouze pro char *, to je mala katastrofa...
cxl (anonym) 14. dubna 2003 ★ [ + ] 0 [0x] [ - ] ← pro ohodnocení komentáře se není nutné nikde registrovat
→ [/-/527] ← na komentář můžete odpovědět nebo ho sdílet
Na druhou stranu koukam, ze jsi konecne vzal na milost dynamickou pamet :)))) Cili nezbyva nez ti to znovu zopakovat: jsi na ceste, ktera konci v C++. A neodmlouvej, vim o cem mluvim, sam jsem si ji prosel.
dex 15. dubna 2003 ← komentářů 2 ☯ 1 [1x] ★ [ + ] 0 [0x] [ - ] ← pro ohodnocení komentáře se není nutné nikde registrovat
→ [/-/529] ← na komentář můžete odpovědět nebo ho sdílet
Objekty nejsou spatny vynalez. Na spoustu veci se nehodi ale ve spouste veci usnadnuji zivot :-)
Treba takove GUI je podle mne lepsi delat objektove. Driv kdyz jsem o objektech nevedel vubec nic (temny davnovek Packalu :-)) jsem pouzival promenne typu zaznam (ruzny typ pro ruzne druhy okna) - bylo to sileny ale taky to fungovalo. Pak jsem "objevil" objekty a zivot byl jednodussi :-))) Hlavne mne nekamenujte ;-) chci jen rict ze "svet" smeruje k objektum (a neni to jenom zasluha mrkvo$oftu ;-)))
xChaos 15. dubna 2003 ← komentářů 5520 ☯ 0 [3050x] ★ [ + ] 0 [0x] [ - ] ← pro ohodnocení komentáře se není nutné nikde registrovat
→ [/-/530] ← na komentář můžete odpovědět nebo ho sdílet
no za objekty te nikdo kamenovat nebude, spis budou kamenovat me za to, ze je rad nema. No na C<<1 se nadale pracuje, tohle byla verze 0.1, ale uz se pracuje na specifikaci 0.2, a uvidite, ze to pujde i bez objektu... ;-)
cxl (anonym) 16. dubna 2003 ★ [ + ] 0 [0x] [ - ] ← pro ohodnocení komentáře se není nutné nikde registrovat
→ [/-/531] ← na komentář můžete odpovědět nebo ho sdílet
Jenze, kamarade, ty neprogramujes bez objektu. To co delas je znovuvynalezani objektoveho a generickeho programovani. To ze predpokladas ze "Zaznam" ma prvky buf a next a definujes algoritmy nad nim, to je typicky genericky pristup. Za chvili prijdes na to, ze mimo maker muzes zalezitost resit tak, ze budes mit nejaky zakladni zaznam a pak ho budes rozsirovat - a vynalezes objektove programovani :)
xChaos 17. dubna 2003 ← komentářů 5520 ☯ 0 [3050x] ★ [ + ] 0 [0x] [ - ] ← pro ohodnocení komentáře se není nutné nikde registrovat
→ [/-/532] ← na komentář můžete odpovědět nebo ho sdílet
Pozor, predpoklad jedine prvek next ! Ten buf je uz soucast prikladu, ne soucast mych maker - to sis spatne nastudoval...
Ostatni stahni si cll1.h v 0.2 ;-)
Zakladni seznam prave mit nechci. Jednou z vyhod maker je, ze se pouzijou jen kdyz je potreba, nemusim mit zadnou dynamicky linkovanou knihovnu. Nepouzita makra se neexpanduji a vubec ve vyslednem kodu nezabiraji zadne misto.
Vyhodou meho pristupu je, ze se nepouzivaji zadne privatni metody, privatni promenne - vsechno je public. Pro open source, ve kterem neexistuji (nebo by nemely existovat) zadne "cerne skrinky", je tenhle pristup idealni..
cxl (anonym) 17. dubna 2003 ★ [ + ] 0 [0x] [ - ] ← pro ohodnocení komentáře se není nutné nikde registrovat
→ [/-/533] ← na komentář můžete odpovědět nebo ho sdílet Sorry, ale pletes pate pres devate. S tim buf jsem se pravda preklepl, nicmene tvoje makra predpokladaji ze ten element ma "next" a budou chodit s cimkoliv co "next" mit bude. Cili typicky genericky pristup.Jinak zda se ze _naprosto_ nechapes smysl... [celkem 1426 znaků] [zobrazit]
Sorry, ale pletes pate pres devate. S tim buf jsem se pravda preklepl, nicmene tvoje makra predpokladaji ze ten element ma "next" a budou chodit s cimkoliv co "next" mit bude. Cili typicky genericky pristup.<P>Jinak zda se ze _naprosto_ nechapes smysl privatnich metod. To nema s open/closed source <B>vubec</B> nic spolecneho. To souvisi s definici interfacu. Je-li metoda privatni, znamena to ze ji nemas pouzivat protoze v pristi verzi knihovny nemusi existovat - je to proste jen pomocna metoda.<P>A pojem cerna skrinka... zase naprosto zasadni nepochopeni. Cerna skrinka znamena, ze v dane chvili te zajima pouze chovani objektu, nikoliv jeho konkretni implementace. Takova typicka cerna skrinka je treba Linux - nezajima te, co se deje uvnitr systemu kdyz udelas fopen. To nema spolecneho s tim, ze linux je open-source (s tim snad budes souhlasit :) a ze kdyz chces, muzes zjistit co se v <B>kokrektni verzi krenelu</B> deje. Ale v jine verzi se muze dit neco uplne jineho, aniz by to melo vliv na funkci programu ktery to fopen provedl.<P> Jeste jinak - pokud se nejaky blazen rozhodne tvuj aktualni vytvor ve verzi 0.2 pouzit a ty se za tyden rozhodnes zplodit verzi 0.3, mozna bys byl rad, aby jeho programy pro verzi 0.2 chodily ve verzi 0.3, ne ? Bez principu cerne skrinky toho nedosahnes. <P>No, abych to shrnul, mozna by ses mel prece jenom seznamit s aktualnim stavem computer science nez zacnes neco plodit ;)
xChaos 19. dubna 2003 ← komentářů 5520 ☯ 0 [3050x] ★ [ + ] 0 [0x] [ - ] ← pro ohodnocení komentáře se není nutné nikde registrovat
→ [/-/534] ← na komentář můžete odpovědět nebo ho sdílet
podle me kompatibilita na urovni API a "cerna skrinka" jsou dva odlisne pojmy.
cxl (anonym) 21. dubna 2003 ★ [ + ] 0 [0x] [ - ] ← pro ohodnocení komentáře se není nutné nikde registrovat
→ [/-/537] ← na komentář můžete odpovědět nebo ho sdílet
V kazdem pripade, pojem "privatni metoda" je o kompatibilite na urovni API.
Pojem "cerna skrinka" pochopitelne muze oznacovat vselicos, vcetne drevene bedynky natrene na cerno, nicmene nepamatuji si na jine pouziti v oblasti pocitacu, elektroniky, matematiky a fyziky, nez jako oznaceni systemu, jehoz vnitrni usporadani v dane chvili neni dulezite a zajimave jsou pouze jeho vnejsi projevy.
xChaos 24. dubna 2003 ← komentářů 5520 ☯ 0 [3050x] ★ [ + ] 0 [0x] [ - ] ← pro ohodnocení komentáře se není nutné nikde registrovat
→ [/-/542] ← na komentář můžete odpovědět nebo ho sdílet
Ano, nekdy jsou cerne skrinky dobre, ale ja nemam rad zaplomboavane cerne sklrinky...
cxl (anonym) 27. dubna 2003 ★ [ + ] 0 [0x] [ - ] ← pro ohodnocení komentáře se není nutné nikde registrovat
→ [/-/544] ← na komentář můžete odpovědět nebo ho sdílet
V tom se tebou musim souhlasit. Nicmene nelze rict, ze zrovna tvuj pristup by mel v tomto smeru nejake vyhody....
xChaos 29. dubna 2003 ← komentářů 5520 ☯ 0 [3050x] ★ [ + ] 0 [0x] [ - ] ← pro ohodnocení komentáře se není nutné nikde registrovat
→ [/-/547] ← na komentář můžete odpovědět nebo ho sdílet
Dockej dalsich pokracovani ucebnice, moje dalsi makra na praci se stringy a textovymi streamy te uzemni ;-)
Jáchym 4. května 2003 ★ [ + ] 0 [0x] [ - ] ← pro ohodnocení komentáře se není nutné nikde registrovat
→ [/-/556] ← na komentář můžete odpovědět nebo ho sdílet
Podle mě si nějak moc šmahem odvrhnul PERL. Ten není dělanej jenom na Web, ale na zpracovávání textovejch řeťezců. Podle toho, co sem se naučil v Cčku (není toho moc, jenom takovej základ) bych řek že cvičit tam s textovejma řeťezcema je ve srovnání s výšezmíněným vlastně nemožný...
A srovnávat PERL a PHP.... že se nestydíš ;o) Nebo mi někdo ukáže Frozen Bubble v PHPku?
cxl (anonym) 5. května 2003 ★ [ + ] 0 [0x] [ - ] ← pro ohodnocení komentáře se není nutné nikde registrovat
→ [/-/559] ← na komentář můžete odpovědět nebo ho sdílet
Hm, no ja nevim, rekl bych ze v C++ se da delat vetsina toho co v cemkoliv jinem (krome snad generovani kusu programu jako retezec a jejich nasledna interpretace). Plus se v C++ da delat spousta jinych veci, ktere se naopak v nicem jinem delat nedaji. PHP ci Perl je zajimave zalezitost, ale proti C++ je to hracka...
xChaos 12. května 2003 ← komentářů 5520 ☯ 0 [3050x] ★ [ + ] 0 [0x] [ - ] ← pro ohodnocení komentáře se není nutné nikde registrovat
→ [/-/566] ← na komentář můžete odpovědět nebo ho sdílet
Jak vlastne muzete vedet, co se v C<<1 da delat se stringama, kdyz jeste nevysla treti cast ucebnice, ktera bude venovana praci se stringy, textovymi soubory, a dalsimi vychytavkami ?
cxl (anonym) 12. května 2003 ★ [ + ] 0 [0x] [ - ] ← pro ohodnocení komentáře se není nutné nikde registrovat
→ [/-/567] ← na komentář můžete odpovědět nebo ho sdílet
No to ja nevim, ja nepsal specificky o retezcich. Na druhou stranu je 100% jiste, ze pomoci maker nelze dosahnout flexibility a vykonu C++.... :)
xChaos 17. května 2003 ← komentářů 5520 ☯ 0 [3050x] ★ [ + ] 0 [0x] [ - ] ← pro ohodnocení komentáře se není nutné nikde registrovat
→ [/-/568] ← na komentář můžete odpovědět nebo ho sdílet
No, ještě si neviděl moje smrtící makra shell() a paste(), která plánuju na třetí díl učebnice ;-) ale zatím mě nefungují, když se zavolají 2x po sobě ... problémy s fork() a dup2(), unixová klasika :-( nikdy jsem nepochopil proč to museli udělat tak zmatečně. No, každopádně aspoň makro parse() už chodí docela dobře, trošku mi dělá problémy split()...
cxl (anonym) 19. května 2003 ★ [ + ] 0 [0x] [ - ] ← pro ohodnocení komentáře se není nutné nikde registrovat
→ [/-/569] ← na komentář můžete odpovědět nebo ho sdílet
Mimochodem, trochu jsem taky pracoval na dokumentaci, tak az priklad na http://www.volny.cz/cxl/idmap.html zvladnes na stejne malem prostoru pri zachovani vykonnosti, tak dej vedet :)
xChaos 22. května 2003 ← komentářů 5520 ☯ 0 [3050x] ★ [ + ] 0 [0x] [ - ] ← pro ohodnocení komentáře se není nutné nikde registrovat
→ [/-/572] ← na komentář můžete odpovědět nebo ho sdílet
No, nějak jsem nepochopil, o čem ten příklad vlastně je...
cxl (anonym) 24. května 2003 ★ [ + ] 0 [0x] [ - ] ← pro ohodnocení komentáře se není nutné nikde registrovat
→ [/-/573] ← na komentář můžete odpovědět nebo ho sdílet
Mas udelat seznam identifikatoru (tedy veci jako "alfa", "beta", proste cokoliv co splnuje podminku pro nazev promenne v C - vcetne, pravda, klicovych slov) ve vstupnim souboru a vypsat jej serazeny podle abecedy nebo cetnosti vyskytu, pricemz u kazdeho indentifikatoru je napsan seznam radek, na kterych se vyskytuji.
Miloslav Ponkrác 3. června 2003 ★ [ + ] 0 [0x] [ - ] ← pro ohodnocení komentáře se není nutné nikde registrovat
→ [/-/576] ← na komentář můžete odpovědět nebo ho sdílet
#define string(LEN) (char *)malloc(LEN)
#define duplicate(A,B) { B=string(strlen(A)); strcpy(B,A); }
Nemáš pocti, že si v malloc zapomněl přidat jeden bajt pro koncovou nulu řetězce? Takhle se Ti pomocí trcpy kopíruje o 1 bajt víc, než jsi si naalokoval. Klasický buffer overrun :-)
xChaos 5. února 2004 ← komentářů 5520 ☯ 0 [3050x] ★ [ + ] 0 [0x] [ - ] ← pro ohodnocení komentáře se není nutné nikde registrovat
→ [/-/704] ← na komentář můžete odpovědět nebo ho sdílet
to duplicate uz je v novejsich verzich opravene ;)
| |
Počet zobrazených komentářů: 24 [celkový čas potřebný k prohledání databáze a vytvoření stránky: 1.27 sekund]
- Konce řádků budou zachovány
- Systém se pokusí o autodetekci platných URL (například http://www.domena.tld/cesta)
- Vložení obrázku do textu: +URL (prozatím nelze kombinovat s vložením odkazu)
- Odkaz na jeden konkrétní příspěvek: @přezdívka:id (předvyplňuje se automaticky při psaní odpovědi)
- Odkaz na aktuální příspěvky pod danou přezdívkou: @přezdívka
- Odkaz na aktuální příspěvky obsahující daný tag: #hashtag (hashtag má minimálně 4 znaky)
- Zvýraznění části textu: *text*
Nápověda: ve vlastním zájmu uvádějte u komentářů pouze funkční a dostupnou e-mailovou adresu.
Přezdívku, která je jednou spojená s konkrétní e-mailovou adresou, už nyní nelze bez zásahu
administrátora serveru spojit s jinou adresou. Uvedením neplatné e-mailové adresy si v budoucnu
znemožníte upload ikonky i možnost použít některé další chystané neanonymní funkce vázané na
uvedení platné e-mailové adresy.
TečkaCZ [Nejnovější články] [Nejnovější komentáře] [Zeď vzkazů] [Zeď odkazů] [Začátek článku]
|
|
 |
|
![[]](http://www.gravatar.com/avatar/94b652a98d5519730d39fdbe0a9dea91?s=40&r=r&default=wavatar) ![[]](http://www.gravatar.com/avatar/64def6753df6be2ce8eca1ebcb7e60ba?s=40&r=r&default=wavatar) ![[]](http://www.gravatar.com/avatar/3ddbf46000c2fbd44759f3b4672b64db?s=40&r=r&default=wavatar) ![[]](http://www.gravatar.com/avatar/7419dbec7ab81c53b12c59ef7db56b00?s=40&r=r&default=wavatar) ![[]](http://www.gravatar.com/avatar/e061c9aea5026301e7b3ff09e9aca2cf?s=40&r=r&default=wavatar) ![[]](http://www.gravatar.com/avatar/04c2a2268c6dae4720162ca923493243?s=40&r=r&default=wavatar) ![[]](http://www.gravatar.com/avatar/25ba3bc8250b0041532b6fdbf24d724b?s=40&r=r&default=wavatar) ![[]](http://www.gravatar.com/avatar/b551730a408be63e0c6af77d2438f8f1?s=40&r=r&default=wavatar) ![[]](http://www.gravatar.com/avatar/a6f30815a43f38ec6de95b9a9d74da37?s=40&r=r&default=wavatar) ![[]](http://www.gravatar.com/avatar/691bec08078f48f6c34ef6a5603a0cb6?s=40&r=r&default=wavatar) ![[]](http://www.gravatar.com/avatar/bfecb2d8170a86bfe1b0eb3f1fdb6232?s=40&r=r&default=wavatar) ![[]](http://www.gravatar.com/avatar/0674cbdb51301f7894b8d05bf481fb1f?s=40&r=r&default=wavatar) ![[]](http://www.gravatar.com/avatar/6b663ca7d843e033b25dd99b83bf548f?s=40&r=r&default=wavatar) ![[]](http://www.gravatar.com/avatar/d73747d27243cd0c1a184b6376e9be49?s=40&r=r&default=wavatar) ![[]](http://www.gravatar.com/avatar/e3b11941ffd286532aaec34ff536973c?s=40&r=r&default=wavatar) ![[]](http://www.gravatar.com/avatar/108ade822132f3c761c33ac9b6736a45?s=40&r=r&default=wavatar) ![[]](http://www.gravatar.com/avatar/d9f21abe46994338d79a9ca2b2e5c5c2?s=40&r=r&default=wavatar) ![[]](http://www.gravatar.com/avatar/9aeaed51f2b0f6680c4ed4b07fb1a83c?s=40&r=r&default=wavatar) ![[]](http://www.gravatar.com/avatar/ba5d187b85a17deb0c50a882226c1c74?s=40&r=r&default=wavatar) ![[]](http://www.gravatar.com/avatar/cd67842a8ddee4e8fb96cfe5dbd847ed?s=40&r=r&default=wavatar) ![[]](http://www.gravatar.com/avatar/9178740077a7834cc1ab45db456ed56e?s=40&r=r&default=wavatar) ![[]](http://www.gravatar.com/avatar/175070b8667db9ee4c03c6b7560c8be4?s=40&r=r&default=wavatar) ![[]](http://www.gravatar.com/avatar/5babb2d10a663e0e1cd1bf91f4a1c4a1?s=40&r=r&default=wavatar) ![[]](http://www.gravatar.com/avatar/826b877c5dd6a123283495f971a8ce8b?s=40&r=r&default=wavatar)
|