.   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 - 2.část → [/131]
xChaos 16. dubna 2003 [6046 znaků] [editováno 17. března 2006] [HowKnow]
★★ [ + ] 2 [2x] [ - ]
Zobrazení 19428 ← Facebook 1 Twitter 3 Google 35
Komentářů 3


Jazyk C<<1 se od vydání prvního dílu učebnice přesunul z verze 0.1 do verze 0.2, takže se seznámíme s nejnovějšími vylepšeními. Zároveň je k dispozici ke stažení header file cll1.h, díky kterému můžete C<<1 začít používat ve svých projektech.
Jazyk C<<1 čelí od prvních dnů své existence mocné kritice, a to nejen ze strany objektově orientovaných programátorů, ale i ze strany svého autora :-) Proto je nyní k dispozici specifikace 0.2 tohoto jazyka, která hned od počátku upravuje postavení C<<1 jako makrojazyka.

Proč ne objektově orientované programování ? Protože Slashdot - pokud vám já nestačím jako dostatečná hlubina myšlení :-) Jak je vidět, tak paralelně více lidí na různých koncích světa dospívá ke stejným závěrům...

Různé důvody, proč rozvíjet jazyk C, jsem uvedl v prvním díle učebnice, ale pro ty pochybovače kterým to snad nestačilo, uvedu jen jeden příklad: opravdu je nezbytně nutné, aby služby na současných super-nadupadných linuxových serverech startovaly třeba i několik desítek sekund jen proto, že se po bootu systém prokousává tunami špatně optimalizovaných skriptů splacáných dohromady v několika různých skriptovacách jazycích ? V některých případech je podle mě malá a rychlá binární utilitika tím správným řešením. A taková utilitka by měla být samozřejmě napsaná pomocí několika základních příkazů, kterým rozumí všichni...

Proč makrojazyk ? C<<1 hned od počátku porušuje některé syntaktické zvyklosti jazyka C. Je jasné, že jeho konstrukce nejsou funkce - a proto jsem v ve verzi 0.2 změnil dvě makra, která svojí syntaxí funkce připomínala.

Makra mají proti funkcím řadu nevýhod (i když jak jsem ukázal už ve verzi 0.1, většinu jich lze obejít, a můžeme zavést i lokální proměnné), mají však jednu zásadní výhodu - a sice jsou typově inertní. Tedy, typová kontrola během překladu by byla příjemná - ale pokud chceme používat stejná makra pro různé datové struktury bez nutnosti přetypování, jsou makra zajímavým nástroje. Makra kromě toho umí jako parametry přijímat nejen číselné pointery nebo pointery, ale naprosto cokoliv - označní typu, položky záznamu, nebo prostě cokoliv. Za makro lze dále napsat složené závorky, a tím z něj udělat řídící konstrukci - jak jsem v minulém díle předvedl na makrech every() a search();

Konkrétně v případě textových stringů by sice bylo možné místo makra použít funkce - ale jakmile bychom jednou začali s funkcemi, tak už by nebylo výhodné definici jazyka psát do headeru, a museli bychom začít budovat regulérní knihovnu. A tomu bych se rád vyhnul, protože jak říkám - je to jazyk určený především začátečníkům, pro tvorbu jednoduchých prográmků zhruba ve stylu ZX Basic. Zatímco samotný header file je možné nainstalovat do /usr/include pro běžné použití všemi překládanými programy, při použití knihovny se příkazová řádka nepříjemně komplikuje, a přichází čas psát Makefile, apod. Nic proti Makefile - ale Linuxu chybí jednoduché vývojové prostření pro začátečníky, a napsat "make test" a neřešit nic dalšího, to prostě rules...

Změny C<<1 ve verzi 0.2

Kvůli výše diskutovaným zádrhelům se mění se syntaxe maker create, string a insert následujícím způsobem:

create(zaznam,Zaznam);
string(nazev_promenne,delka);
insert(zaznam,hlava_seznamu,order_by,nazev_numericke_polozky);
insert(zaznam,hlava_seznamu,desc_order_by,nazev_numericke_polozky);
insert(zaznam,hlava_seznamu,sort_by,nazev_textove_polozky);
insert(zaznam,hlava_seznamu,desc_string_by,nazev_textove_polozky);

Funkci starého insert() přebírají nová makra append(), resp. push(), která připojí záznam na konec, resp. začátek seznamu. Makro insert() nyní umožňuje zadat operátor a jednu členskou položku záznamu (member), podle které se záznam zatřídí do seznamu - pokud je tato položka číslo, je třeba použít operátor order_by či desc_order_by, pokud je tato položka řetězec, je třeba použít sort_by nebo desc_sort_by. Samozřejmě, pro jiné datové typy si pokročílí uživatelé C<<1 mohou nadefinovat vlastní operátory, no problem.

Pro úplnost uvádím definice nových maker pro práci se seznamy:

#define order_by(K1,K2) (K1>K2)
#define desc_order_by(K1,K2) (K1<K2)
#define sort_by(K1,K2) (strcmp(K1, K2)>0)
#define desc_sort_by(K1,K2) (strcmp(K1, K2)<0)

#define create(A,T) { A=(struct T *)malloc(sizeof(struct T)); A->next=NULL; }
#define push(A,B) { if(A && A!=B) A->next=B; B=A; }
#define append(A,B) { if(B) { void *N=A; A->next=NULL; \
 search(A,B,!A->next) {A->next=N; break;}} \
 else push(A,B); }
#define insert(A,B,EXP,K) { if(B) { void **L=NULL, *H=B; search(B,H,EXP(B->K,A->K)) \ 
 { if(L) {*L=A; A->next=B; } else push(A,H); break; } \
 else L=(void *)&(B->next); if(!B)*L=A; B=H; } else push(A,B); }
#define sort(A,B,EXP,K) { void *C; A=B; B=NULL; \
do { C=A->next; A->next=NULL; insert(A,B,EXP,K); A=C; } while(C); }
#define remove(A,B,C) { void **D=NULL; search(A,B,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; }
 

Samzořejmě, pokud chcete třídit seznamy jen podle jednoho klíče, tak si při důsledném vynechání maker push() a append() bohatě vystačíte zkrátka s trvalým používáním makra insert(). Ale proč se omezovat na jeden klíč, když třídit podle čehokoliv je nyní tak úžasně jednoduché ?

Dnes si můžete si stáhnout komletní hlavičkový soubor cll1.h a k němu demo cll1demo.c, které pod Linuxem přeložíte příkazem make cll1demo a spustíte příkazem ./cll1demo :-) Věřím, že zejména pro linuxové programátory-začátečníky budou experimenty jazykem C<<1 příjemným odpočinkem po studiu některých záludností skriptování v shellu či některých záludností práce s pointery v jazyce C.

To je pro dnešek všechno - příště se podíváme, jak se verze 0.3 jazyka C<<1 vyrovná se složitějšími operacemi s textovými řetězci tak, aby nepůsobily potenciální bezpečnostní problémy (podle jen velice obtížně...:-)


Optimalizace: pokud používáte prohlížeč s jádrem Mozilla (Firefox 3.8-8.0) v dostatečně velkém okně a na monitoru s dostatečným rozlišením, tak nepřehlédněte pokračování textu v dalším sloupci vícesloupcové sazby ! Tato feature je sice v prohlížečích s jádrem Webkit (Google Chrome, Safari, Konqueror) teoreticky také k dispozici - ale bohužel se chová nepředvídatelně a nepoužitelně: sloupce které se na obrazovku nevejdou, jednoduše skryje. [zpět na začátek sloupcové sazby]
Pokud se vám článek líbil, můžete podpořit provozovatele serveru zasláním Bitcoin daru dle vlastního uvážení na BTC účet č. [19rriLx8vR19wGefPaMhakqnCYNYwjLvxq] :-)
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/131]
Všechny články [tohoto autora] [v rubrice HowKnow]


Hodnocení článku čtenáři [ + ] 2 [2x] [ - ]
Komentáře [napsat]
Skrýt komentáře hodnocené nebo méně

[] fikus (anonym) 6. května 2003 ← komentářů 565 ☯☯☯ 71 [117x]
[ + ] 0 [0x] [ - ] ← pro ohodnocení komentáře se není nutné registrovat, stačí kliknout na + nebo -
→ [/-/561] ← na komentář můžete odpovědět
mi se oba clanky o C<<1 libi. sam jsem zacal
s C++, zkusil jsem Javu. nakonec jsem se vratil
k C, ale casto v C programuji pseudo-objektove,
misto classu mam struct.

[] cxl (anonym) 7. května 2003
[ + ] 0 [0x] [ - ] ← pro ohodnocení komentáře se není nutné registrovat, stačí kliknout na + nebo -
→ [/-/562] ← na komentář můžete odpovědět
Jo, prosel jsem necim podobnym. Ale na druhy pokus jsem u C++ zustal.
Jinak mezi class a struct je skutecne jenom minimalni rozdil.... (jak ostatne zduraznuji vsichni pravoverne-objektovi kritici C++ :)

[] xChaos 9. května 2003 ← komentářů 4534 ☯ 20 [2248x]
[ + ] 0 [0x] [ - ] ← pro ohodnocení komentáře se není nutné registrovat, stačí kliknout na + nebo -
→ [/-/563] ← na komentář můžete odpovědět
no jenomze ono C&lt;&lt;1 nebude jen o struct a o spojovych seznamech struct.... me se nelibi treba mit pointery na funkce jako soucast struktur, prijde mi to jako potencialne insecure a bordel... kopirovanim spatne casti pameti muzu coredumpnout, ale zavolanim nedefinovaneho kodu... fuuuj!

v pristim dile se chci vrhnout na jednoduche parsovani textovych souboru a streamu a na shell level MySQL interface... na socket level API si zatim netroufam, a linkovat libmysql k aplikacim se mi nejak nechce...

Pozor: vložením komentáře souhlasíte s pravidly hry, které vyhlásil provozovatel webu! [zobrazit pravidla]
Ochrana proti spambotům - tři-krát-tři je ... ? (napište číslicí - nemělo by byt potřeba při zapnutém JavaScriptu)
Sociální síť (přihlaste se předem, 1. řádek<=100 znaků=status, zbytek=odkaz)
Přezdívka (povinně) - nepoužívejte speciální znaky, mezery=podtržítka
E-mail (volitelně) - nebude zobrazen, bude zobrazena ikonka z [www.gravatar.com]

V komentáři nelze použít HTML [zobrazit mikrosyntax]

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
  •  
  • Komentáře →
  • Debaty →
  • Články →
  • Rubriky →
  • Ostatní →

Yacy P2P web search

jabber.arachne.cz

MyPower.CZ - Elektřina zdarma

. tiskové zprávy a otevřené dopisy přebíráme z nejrůznějších informačních kanálů (i bez výslovného souhlasu autorů)
licenční práva k použitým obrázkům a grafickým motivům nejsou definována (přebírejte pouze texty bez obrázků)
texty článků i komentáře bez uvedení copyrightu jsou chráněny GNU Free Documentation License
založeno na Quzo engine, (G)1999-2002 David Čermák, (G)2002-2011 Michael Polák
Quzo engine vyvíjejí Arachne Labs, webhosting sponzorují SPOJE.NET
seznam aktuálních článků je dostupný i ve formátu RSS (XML)
můžete také sledovat Twitter feed TečkyCZ.
test XHTML a CSS2 validity
[Právě dnes | Tech | Ostatní] [Arachne Labs]
[SPOJE.NET]