Programovací jazyk C: velmi, velmi stručně - MujMAC.cz - Apple, Mac OS X, Apple iPod

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:

Seriály

Více seriálů



Software

Programovací jazyk C: velmi, velmi stručně

29. dubna 2004, 00.00 | Tento článek je určen těm, kdo v jazyce C příliš neprogramují a chtějí si jej zběžně oživit; snad i těm, kdo jsou zběhlí v jiných jazycích a snadno se dokáží adaptovat na mírně odlišnou syntaxi a sémantiku jiného programovacího jazyka.

Tento článek je určen těm, kdo v jazyce C příliš neprogramují a chtějí si jej zběžně oživit; snad i těm, kdo jsou zběhlí v jiných jazycích a snadno se dokáží adaptovat na mírně odlišnou syntaxi a sémantiku jiného programovacího jazyka. Pokud však někdo C nezná vůbec a k tomu není zkušeným programátorem, tento krátký přehled mu rozhodně nebude stačit: v takovém případě je zapotřebí si sehnat, přečíst a nastudovat některou z knih o jazyce C (nejraději některou z těch mých, samozřejmě ;)

Naopak zkušeným programátorům v "Céčku" tento díl nepřinese zhola nic, a mohou jej klidně přeskočit. Nebojte se, hned příště se pustíme do nadstavby Objective C, a ta již bude nová a zajímavá i pro vás. Zatím však prosím ještě mějte chvilku strpení s těmi, kdo v C zdaleka tak moc doma nejsou.

"Céčko" patří mezi nejjednodušší programovací jazyky vůbec; přesto se o něm dá napsat celá kniha. Zde ovšem neaspirujeme ani zdaleka na takovou důslednost – jen si stručně připomeneme základní principy a základní konstrukce jazyka, bez nároku na absolutní přesnost a úplnost. O rysech jazyka, jež se v Objective C běžně neužívají (kupříkladu unie či bitová pole) pak se nebudeme zmiňovat vůbec.

Co je nám vůbec do nějakého C?!?

Inu, to je jednoduché: Objective C je nadstavba jazyka C, libovolný korektní program v C je tedy zároveň korektním programem v Objective C (naopak to samozřejmě neplatí). To je ovšem zcela úmyslné, aby (a) se zkušení programátoři v C mohli Objective C naučit snadno a rychle (a jak uvidíme příště, sama nadstavba je opravdu velmi, velmi jednoduchá), (b) bylo snadné přenést do prostředí Objective C libovolný již existující kód či knihovnu.

Řada věcí se tedy v Objective C řeší přesně stejně jako v C: chceme naprogramovat podmínku, cyklus či využít celočíselné proměnné? Máme k dispozici příkazy if či for nebo deklaraci typu int přesně – skutečně úplně přesně – stejně, jako v klasickém jazyce C (tedy, "klasickém" – dnes překladač GNU ObjC++, užívaný v Mac OS X, podporuje dokonce i C99; na úrovni, na které se zde ale budeme jazykem zabývat, relativně nepodstatné rozdíly mezi variantami ANSI či C99 nejsou vůbec důležité).

V následujících několika odstavcích tedy "z rychlíku" projedeme nejdůležitější z vlastností jazyka C, s nimiž se v programech, psaných v Objective C běžně pracuje (všechny ostatní prvky C jsou samozřejmě také k dispozici; jen se jich užívá výjimečně – a my se jimi proto nebudeme zabývat).

Komentáře

Cokoli, co je mezi dvojicemi znaků /* ... */, nebo na řádku za dvojicí znaků //, se ignoruje.

Typy a proměnné

Základem každého jazyka jsou jeho příkazy a datové typy. Datové typy jazyka C jsou

  • char, unsigned char, unichar, int, unsigned (int), long, unsigned long, long long, unsigned long long: celočíselné typy, všechny určují různě velká celé čísla, od jediného byte až po osmibytovou obludu long long. Modifikátor unsigned znamená číslo bez znaménka (libovolná hodnota je větší nebo rovna nule). Speciální typ unichar je dvoubytové číslo, běžně reprezentující jeden znak v kódu Unicode; namísto unsigned char lze používat pohodlnější zkratku u_char. Znak se v C vždy interpretuje jako odpovídající číslo v patřičné kódové tabulce; speciální typ "znak" tedy není zapotřebí, celočíselné typy char a unichar jej snadno nahradí. Není třeba také typ "boolean" – i na jeho místě lze užít libovolný jiný typ s konvencí "pravda==nenulová hodnota, nepravda==nula";
  • float a double jsou typy užívané pro čísla s pohyblivou řádovou čárkou;
  • speciální typ void znamená "nic";
  • cokoli* je "ukazatel na cokoli": typ, representující adresu v paměti, na níž se nalézá hodnota typu "cokoli". Kupříkladu typ int* je tedy adresa, na níž je celé číslo; často se užívá void* pro adresu, k níž není žádná typová informace k dispozici.

Proměnné lze deklarovat uvedením jména typu a za ním seznamu jmen proměnných: "int a,b,c,d" deklaruje čtyři proměnné typu int. Modifikátor "*" pro ukazatel se týká pouze nejbližšího identifikátoru – "int *a,b,*c" tedy deklaruje dva ukazatele na int (a, c), a jeden prostý int (b). Deklarace se ukončuje středníkem a (v současné versi jazyka) může stát prakticky kdekoli.

Pro libovolný typ můžeme vytvořit nové jméno pomocí klíčového slova typedef – např. tedy "typedef int XXX" zajistí, že nadále bude XXX typ, ekvivalentní typu int; "typedef int *IntPtr" pak vytvoří typ IntPtr, representující ukazatel na int.

Konstanty a výrazy

Celočíselné konstanty jsou čísla v běžném desítkovém zápisu nezačíná-li nulou; pokud číslo obsahuje tečku nebo "e" (pro exponent) nebo obojí, jde o konstantu typu float či double. Celočíselné konstanty lze zapisovat i osmičkově (začínají-li nulou) nebo šestnáctkově (začínají-li znaky "0x" či "0X"). Znaková konstanta je prostě znak v apostrofech (třeba 'a').

Číselné výrazy lze spojovat pomocí standardních operátorů +, -, * (násobení), /, a jen pro celočíselné výrazy také % (zbytek po dělení). Pozor – dělení celočíselných výrazů je celočíselné, takže "5/3" je 1. Pro celá čísla lze použít také operátory & (operace AND bit po bitu), | (operace OR bit po bitu), ^ (operace XOR bit po bitu) a ~ (unární operátor, negace bit po bitu), << (posun levého operandu doleva o počet bitů, zadaný pravým operandem) a >> (posun doprava).

Unární operátor * je dereference ukazatele: je-li tedy např. "ip" ukazatel na proměnnou typu int, pak výraz "*ip" odpovídá obsahu této celočíselné proměnné.

Operátor = musí mít na levé straně proměnnou (či dereferenci ukazatele), a do ní uloží hodnotu výrazu na pravé straně. Celé přiřazení je výraz, jehož hodnotou je "to, co se přiřadilo" – díky tomu jsou korektní mj. i výrazy typu "a=(b=c+3)+1", kde se nejprve do proměnné "b" uloží součet proměnné "c" a 3, k tomu se přičte jednička, a výsledek se uloží do "a".

Pro pohodlí programátora jsou v C k dispozici kombinované operátory X=, jež užijí cílovou proměnnou zároveň jako prvý operand – kupříkladu "a+=3" je tedy totéž, jako "a=a+3"; "b<<=2" je totéž, jako "b=b<<2".

Nad proměnnými (a dereferencemi ukazatelů) máme k dispozici i speciální příkazy autoinkrementace a autodekrementace: je-li např. "i" proměnná, pak výraz "i++" má hodnotu "i", ale bezprostředně po jeho vyhodnocení se hodnota "i" o jedničku zvýší. Výraz "++i" má hodnotu "i", zvýšenou o 1. Obdobně je tomu s výrazy "--i" a "i--".

Operátor & může stát také jako unární před proměnnou; pak vytvoří ukazatel na tuto proměnnou (tj. deklarujeme-li např. "int i,*ip", můžeme do ukazatele ip uložit adresu proměnné i příkazem "ip=&i". Ukazatel vytvoří také speciální řetězcová konstanta: řada znaků v uvozovkách je typu char*, a hodnotou je adresa dané sekvence znaků v paměti. Speciální konstanta NULL je prázdný ukazatel – adresa, jež "neukazuje nikam" (samozřejmě, ukazuje na adresu 0, ta však je z definice nevalidní).

Speciální podmínkový operátor "v1?v2:v3" vyhodnotí výraz v1; je-li nenulový, je hodnotou celého výrazu v2, pokud byl nulový, je hodnotou celého výrazu v3. Náš překladač GNU C z Mac OS X navíc jako příjemné rozšíření oproti standardu umožňuje v2 vynechat – příkaz "v1?:v2" je ekvivalentní příkazu "v1?v1:v2".

Výrazy můžeme porovnávat pomocí operátorů ==, <=, >=, <, >, != (kde == zjišťuje rovnost, != nerovnost, a význam ostatních je zřejmý). Výsledkem je nula nebo nenula podle konvence "pravda==nenulová hodnota, nepravda==nula". Tyto výrazy pak můžeme spojovat do složitějších logických výrazů pomocí operátorů && (logické AND) a || (logické OR) a ! (logická negace).

Struktury

Více proměnných lze spojovat do bloků, jimž říkáme struktury. Jejich deklarace užívá klíčové slovo struct, za nímž je ve složených závorkách seznam všeho, co do struktury patří:

struct X { int a,b; float c; }

deklaruje strukturu jménem struct X (v praxi se častěji používá pojmenování pomocí výše zmíněného klíčového slova typedef), jež obsahuje dvě proměnné typu int a jednu typu float. K proměnným uvnitř struktury se přistupuje pomocí tečky – je-li kupříkladu foo proměnná typu struct X, pak "foo.b" je druhá z jejích celočíselných proměnných. V Cocoa se často struktury používají pro jednoduché složené hodnoty, např. "bod", složený z dvojice hodnot "x" a "y".

Příkazy

Libovolný výraz v C můžeme ukončit středníkem, a stane se příkazem. Libovolnou skupinu příkazů můžeme uzavřít do složených závorek, a stane se tzv. blokem – jednotkou, na niž můžeme pohlížet jako na celek (a např. rozhodnout, zda se celý blok příkazů provede nebo ne). Obecně může vždy blok stát kdekoli, kde může stát příkaz.

Kromě toho C nabízí několik málo speciálních příkazů:

if (výraz) then příkaz
if (výraz) then příkaz else příkaz2

Podmínkové příkazy; pokud je hodnota výrazu nenulová, provede se příkaz (a neprovede příkaz2, je-li uveden). Je-li výraz nulový, je tomu naopak.

while (výraz) příkaz

Výraz se vyhodnotí, a je-li nenulový, provede se příkaz. A tak pořád dokola, dokud není výraz nulový.

Velmi flexibilní je příkaz for – zápis

for (v1;v2;v3) příkaz

zhruba odpovídá následující sekvenci:

v1;
while (v2) {
  příkaz
  v3;
}

Běžně se užívá pro standardní cykly – např. "for (i=0;i<10;i++) foo" provede příkaz foo pro všechny hodnoty i od nuly do devíti –, avšak jeho flexibilita je velmi šikovná právě v Objective C: až se později seznámíme s třídami NSEnumerator či NSIndexSet, uvidíme, jak se nám bude obecnost příkazu for skvěle hodit.

V jazyce nízké úrovně je samozřejmostí klasický příkaz goto, který předá řízení na zadané návěští; návěštím je libovolný identifikátor, ukončený dvojtečkou.

Speciálním případem, který se velmi podobá využití goto, je příkaz switch; ten má jeden celočíselný argument, a předá řízení na návěští case N, kde N musí odpovídat skutečné hodnotě argumentu. Pro opuštění příkazu switch je nutné použít příkazu break:

switch (n) {
  case 0:  // následující kód se provede, je-li n nulové
    ...
  case 1: // následující kód se provede je-li n==1
          // a také je-li n nulové, protože jsme nepoužili break
    ...
    break;
  case 2: // následující kód se provede jen je-li n==2
    ...
}

V příkazu switch může být i speciální návěští default, jež znamená "jakákoli jiná hodnota".

Funkce a struktura programu

Příkazy lze sdružovat do funkcí: funkce je pojmenovaný blok (viz výše), jenž může užívat formálních parametrů. Navíc funkce buď vrací hodnotu nějakého typu (pomocí speciálního příkazu return), nebo je typu void. Funkce se deklaruje tak, že nejprve uvedeme návratový typ, pak jméno funkce, a za ním v závorkách seznam parametrů. Za seznamem je blok, jenž popisuje vlastní obsah funkce:

int max(int a,int b) {
  if (a>b) return a;
  return b;
}

Funkci můžeme kdykoli volat tím, že uvedeme její jméno a na místech parametrů konkrétní hodnoty – např. "i=max(2,3)".

Program v klasickém jazyce C se skládá z libovolného množství funkcí, mezi nimiž je jedna výjimečná; ta má jméno main a je deklarována speciálním způsobem. Po zavedení do paměti se automaticky spustí právě funkce main, a ta pak podle potřeby volá funkce ostatní.

Preprocesor

Jazyk C standardně obsahuje velmi výkonný preprocesor; my si z něj ukážeme jen ty nejzákladnější služby:

#define IDENTIFIKATOR cokoli

v následujícím kódu nahradí všechny výskyty řetězce IDENTIFIKATOR (jež nejsou v uvozovkách) řetězcem cokoli. Definice maker lze i parametrizovat, takže např. namísto funkce max z minulého odstavce jsme mohli definovat makro

#define MAX(a,b) ((a)>(b)?(a):(b))

jež by fungovalo (téměř) stejně dobře (existuje určitý drobný rozdíl, avšak na úrovni, na níž se pohybujeme, není podstatný).

Speciální direktiva include vloží zadaný soubor; to je proto, aby více různých zdrojových souborů mohlo snadno užívat společných deklarací:

#include <jméno_souboru>
#include "jméno_souboru"

V Objective C se na místě této direktivy používá důsledně direktiva import, jež funguje podobně, je však "chytřejší" v případech, kdy by se při vzájemném vkládání souborů mohlo stát, že by se jeden soubor interpretoval vícekrát za sebou. Objective C však není naše dnešní téma: do něj se podrobně ponoříme hned příště!

Obsah seriálu (více o seriálu):

Tématické zařazení:

 » Rubriky  » Informace  

 » Rubriky  » Agregator  

 » Rubriky  » Začínáme s  

 » Rubriky  » Software  

Diskuse k článku

 

Vložit nový příspěvek   Sbalit příspěvky

 

pozor na xcode...

Autor: enif Muž

Založeno: 29.04.2004, 07:49
Odpovědí: 0

Mozna, ze jsem udelal neco spatne, ale vcera se mi stalo, ze po vytvoreni noveho .c souboru v projektu a naslednem vlozeni zdrojaku ze schranky
mi xcode za KAZDY znak vlozilo znak NULL ('\0').
Tim padem jiz tento zdrojak neslo zkompilovat a temer ani zeditovat. Ani zadny jiny editor to nevyresil. :-(

Nakonec jsem si poradil timto filtrem:

#include

int main(void)
{
int c;

while ((c = getchar()) != EOF)
if (c != 0) putchar(c);

return 0;
}

Toto pustite: rmnull < soubor.c > soubor_nonull.c
a je po problemu. Ale jestli se to pude opakovat casteji...

e.

Odpovědět na příspěvek

RE: pozor na xcode...

Autor: Milan Muž

Založeno: 29.04.2004, 12:58

To vypada, jako by vkladal Unicode (UTF-16) znaky (ty jsou pro ASCII znaky tvorene dvojici znak a 0x00). V tom pripade ale funkce Paste nefunguje v Xcode zcela 'optimalne' ;-)

Odpovědět na příspěvek

RE: RE: pozor na xcode...

Autor: enif Muž

Založeno: 29.04.2004, 15:10

je to vzlastni. mam nastaveno kodovani (v xcode) na win1250 (zdrojaky zpracovavam i pod win), takze nevim, vo co go... ;-)

Odpovědět na příspěvek

include vs. import, ANSI vs. C99

Autor: Jaroslav Aster Muž

Založeno: 29.04.2004, 10:56
Odpovědí: 0

Dobry den,
Object C neznam, ale v klasickem C, kde se pouziva jen include, se vicenasobnemu natezeni zabrani definici marka.

pr. souboru:

#ifndef MOJE_MAKRO
#define MOJE_MAKRO

/* code */

#endif

Dale bych chtel rict, ze rozdily mezi C99 a ANSI preci jenom trosku podstatne jsou. Napr. Vami zminovany styl komentovani // neni v ANSI C povolen. Dale inline funkce misto maker a tak podobne. Podle me je, v dnesni dobe, archaismus stale vyucovat ANSIC nebo, nedej boze, K&R.

Ale abych jenom nekritizoval. Moc Vam dekuji za tento serial. Docela se tesim, az se o Object C neco dozvim. Jen me mrzi, ze nemam moznost pristupu na nejaky pocitac s MacOS X.

Odpovědět na příspěvek

include vs. import, ANSI vs. C99

Autor: Jaroslav Aster Muž

Založeno: 29.04.2004, 11:10
Odpovědí: 0

Dobry den,
Object C neznam, ale v klasickem C, kde se pouziva jen include, se vicenasobnemu natezeni zabrani definici marka.

pr. souboru:

#ifndef MOJE_MAKRO
#define MOJE_MAKRO

/* code */

#endif

Dale bych chtel rict, ze rozdily mezi C99 a ANSI preci jenom trosku podstatne jsou. Napr. Vami zminovany styl komentovani // neni v ANSI C povolen. Dale inline funkce misto maker a tak podobne. Podle me je, v dnesni dobe, archaismus stale vyucovat ANSIC nebo, nedej boze, K&R.

Ale abych jenom nekritizoval. Moc Vam dekuji za tento serial. Docela se tesim, az se o Object C neco dozvim. Jen me mrzi, ze nemam moznost pristupu na nejaky pocitac s MacOS X.

Odpovědět na příspěvek

kniha o C

Autor: Tomáš Muž

Založeno: 29.04.2004, 14:48
Odpovědí: 0

Dobrý den,

mnohokrát děkuji za výborný článek. V úvodu se zmiňujete o nutnosti (pro začátečníky) nastudovat něktoru z knih o jazyce C (nejlépe některou z Vašich ;-)). Díval jsem se na Vltavu a hledal i přes Google, ale nějak se mi žádnou Vaši knihu o C nepodařilo najít. Mohl byste mě prosím nasměrovat?

Děkuji a přeji všem příjemný den.
Tomáš

Odpovědět na příspěvek

RE: kniha o C

Autor: wessan Muž

Založeno: 29.04.2004, 18:02

Myslim, ze hodne dobra kniha o c++ je "Mistovstvi v C++", i kdyz se muze zdat, ze je to pro profiky, bere to od zakladu a dost dukladne, pro nekoho kdo chce uvest do c++ idealni.

Odpovědět na příspěvek

RE: RE: kniha o C

Autor: AK-79 Muž

Založeno: 30.04.2004, 11:11

zdravim,

taky bych se chtel vrhnout na programovani v Objective C, ale jsem vicemene uplny zacatecnik, a to i v programovani, nechci programovat nic rozsahleho, ale jen tak pro radost. V cestine jsou knihy jenom o C nebo C++, resp. uvody do techto jazyku. Mel bych teda zacit spis s C for dummies nebo s C++ for dummies? Myslim tim, pokud chci pak delat v Objective C.
Diky.

Odpovědět na příspěvek

RE: RE: RE: kniha o C

Autor: OC Muž

Založeno: 30.04.2004, 12:27

Rozhodně C!!!

C++ je úplně nesmyslný jazyk, a jeho "objektová podpora" (jež nemá s objekty ve skutečnosti zhola nic společného) leda tak začátečníka zmate a naučí jej různým zlozvykům.

Odpovědět na příspěvek

RE: RE: RE: RE: kniha o C

Autor: Tomáš Muž

Založeno: 30.04.2004, 15:53

A nějaký odkaz na některou z Vašich knih by byl? (Viz můj první příspěvek)

Děkuji,

Tom

Odpovědět na příspěvek

RE: RE: RE: RE: RE: kniha o C

Autor: OC Muž

Založeno: 30.04.2004, 16:38

Omlouvám se, přehlédl jsem to :(

Poptával jsem se, a bohužel ne: zdá se, že žádná z mých knih o C už se neprodává :( Takže bohužel asi nezbývá, než si pořídit něco o C++, a všechny ty "++" části pečlivě přeskakovat...

Já bych samozřejmě některou z těch knih milerád vystavil na Webu, jenže bohužel už je nemám v použitelných archivech: tyhle staré věci z dob, kdy CD-R (víceméně) neexistovalo, mám archivované na médiích SyQuest 3.5" -- a mechanika už mi dávno, dávno zahynula :(

Odpovědět na příspěvek

RE: RE: RE: RE: kniha o C

Autor: Jan Volf Muž

Založeno: 30.04.2004, 17:12

Dovolím si s vámi nesouhlasit, co se týče tvrzení, že objektová podpora C++ nemá nic společného s objekty. Dokonce si myslím, že pokud bych přednostnil optimalizaci a výkon aplikace před komfortem a nebyl bych nutně závislý na Cocoa frameworku, tak bych pro ten konkrétní proces volil C++.
Proto být vámi, zdržím se podobných zavádějících výroků a raději se soustředím na přípravu další kapitoly, sem upřímně zvědav jak se poperete s popisem principů objektově orientovaného programování. Každopádně vám fandím, ať se vám to povede, nemyslím, si že je to jednoduchý úkol.
Co se týče knihy o jazyce C, já s úspěchem používám tu od Herouta, jako referenční příručka je dobrá.

Odpovědět na příspěvek

RE: RE: RE: RE: RE: kniha o C

Autor: OC Muž

Založeno: 30.04.2004, 17:50

C++ pro "ten proces" zvolit nemůžete nikoli proto, že si návrháři Cocoa ze zpanštělosti vybrali ObjC, nýbrž docela jednoduše proto, že vzhledem k naprosto dementnímu návrhu C++ v něm rozumný systém dynamických vazeb mezi (nejen) GUI či databází a kódem NELZE sestavit. A víte proč? To je jednoduché: právě proto, že "objektová podpora" (ve velmi tučných uvozovkách), již C++ nabízí, NEMÁ NIC SPOLEČNÉHO Z OBJEKTY.

Čtěte seriál dále, uvidíte proč. Prozatím velmi zjednodušeně -- protože C++ nemá polymorfismus: pokud nenapíšete "virtual", nemá jej vůbec; pokud napíšete "virtual", je krajně omezený (jen na podtřídy dané třídy). Dále nemá encapsulation (protože překladač volání metody x třídy Y přeloží obecně na JINÝ kód, než volání metody z třídy T -- a tím je to dokonale v pytli v jakémkoli případě, kdy byste chtěl pracovat s obecnými objekty). Konečně je to šíleně, neúnosně nebezpečné, neboť pokud se ten kód "pro x z Y" náhodou ve skutečnosti použije "pro z z T", nedojde ani ke slušné běhové chybě, místo toho se může stát naprosto cokoli (třeba že program bez sebemenšího varování běží dál, jen dává nesprávné výsledky). Dále pak v C++ nelze implementovat key/value coding (nemůžete napsat obecnou metodu "valueForKey:string", jejímž argumentem je jméno metody, jež se má volat: "obj.valueForKey("foo")" je (v Javě, ne v C++) tedy ekvivalentní "obj.foo()".

A to už vůbec nemluvím o fragile class syndromu, jehož vinou je "objektový" (ve velmi tučných uvozovkách) model C++ naprosto nepoužitelný pro spolupráci mezi různými moduly, takže namísto toho, aby různé moduly prostě spolupracovaly v rámci objektového modelu, jako tomu je v každém slušném jazyce, v rámci C++ musejí vznikat mimojazykové ošklivosti typu COM (což je v praxi jen poor man's hack, který _zčásti_ dohání to, co rozumný objektový model nabízí automaticky).

Odpovědět na příspěvek

RE: RE: RE: RE: RE: RE: kniha o C

Autor: Jiri Volejnik Muž

Založeno: 03.05.2004, 16:19

Vase tvrzeni o problemech s encapsulation v C++ je nesrozumitelne. Ukazte to prosim na konkretnim zdrojovem kodu, jinak je to bezpredmetne.

Odpovědět na příspěvek

RE: RE: RE: RE: kniha o C

Autor: Jiri Volejnik Muž

Založeno: 03.05.2004, 15:53

Nesmyslny neni jazyk C++, ale Vase vyroky o nem! Rici ze C++ nema polymorfismus, ze objektova podpora kterou C++ nabizi nema nic spolecneho s objekty, ze navrh C++ je naprosto dementni, nebo ze C++ nema encapsulation, je smesne. Nezmeni na tom nic ani podtrzitka kolem slov, ani sebetucnejsi uvozovky. To je prilis velke zjednoduseni, ktere si proste nemuzete dovolit, leda pred naprosto neznalymi lidmi. Stejne tak jako Jan Volf bych Vam doporucil abyste se soustredil na Objective-C. Preji Vam hodne uspechu a vice objektivity.

Odpovědět na příspěvek

RE: RE: RE: RE: RE: kniha o C

Autor: OC Muž

Založeno: 03.05.2004, 17:09

Ach jo. Přečtěte si znovu co jsem psal. Nemám ani čas ani náladu se s Vámi hádat, uvádím prostě fakta.

- C++ má polymorfismus jen v omezené mmíře. Proč? Protože pro dvě třídy A a B jež obě implementují metodu foo(), jedna z nich není nadtřídou druhé, a jejich instance a a b v C++ _neexistuje_ způsob, jak napsat ve zdrojovém kódu x.foo(), jež by fungovalo obecně i pro případ, že x je a, i pro případ, že x je b.

- C++ nemá korektní encapsulation, protože překladač bere v úvahu vnitřní informace o třídě ve chvíli, kdy překládá výraz a.foo(). Jinými slovy, vnitřní struktura třídy není skryta. Jinými slovy, nemáme encapsulation.

Naprost
o dementní pak je takový jazyk, který má fragile class syndrom bez možnosti jakéhokoli rozumného workaroundu, a ve kterém překladač zpracuje a.foo() tak idiotsky, že pokud se týž kód náhodou zavolá pro instanci jiné třídy, nedojde vůbec (!) k ohlášení chyby, ale namísto toho se může stát naprosto cokoli, od zhroucení programu až po bezproblémový běh se zcela nesmyslnými výsledky.

To vše jsou naprosto objektivní fakta. Mohou se Vám nelíbit, můžete je bohorovně přehlížet, ale nic na nich nezměníte. Až budete mít za sebou (jako já) projekty v C++ i Objective C, složené z mnoha spolupracujícíh modulů od řady nezávislých programátorů, v nichž Váš vlastní kód bude přesahovat několik set tisíc řádků, můžeme se o tom pobavit znovu; pak to ovšem bude zbytečné, neboť pak konečně pochopíte, o čem mluvím.

Odpovědět na příspěvek

RE: RE: RE: RE: RE: RE: kniha o C

Autor: Jiri Volejnik Muž

Založeno: 04.05.2004, 01:07

Ani ja nemam naladu se hadat, zejmena o tak samozrejmych vecech. I me to ubira cas a enrgii. Pisu to proste proto abych alespon zcasti uvedl na pravou miru Vase mylne informace, ktere "leda tak začátečníka zmatou". To ze nepresvedcim Vas je zrejme a ani mi na tom nesejde. I ja programuji dlouha leta, mam za sebou take hodne projektu ktere take obsahuji minimalne x-tisice radek meho kodu (nemam ale zadny duvod je pocitat), i projektu na kterych spolupracovalo vice lidi (i nekteri Vasi byvali spolupracovnici). Programuji v C++ i v Objective-C. Ale takove veci bych nevypustil z ust a udivuje mne to u cloveka, ktery si dela ambice ucit programovat druhe!

- Takze C++ polymorfismus ma, a to na dvou urovnich: run-time a compile time. Run-time skrze virtualni metody, resp. dedicnost, compile-time skrze sablony. Priklad, ktery uvadite, neni spravny, nebot staci aby obe tridy byly potomkem dalsi, ze ktere zdedi metodu foo(). Objective-C nema compile-time polymorfismus, ale ma "navic" protokoly. Protokol je ovsem to same co v C++ abstraktni trida + multiple inheritance. Proto ty uvozovky. Mam tedy snad podle Vaseho vzoru tvrdit, ze Objective-C nema polymorfismus, protoze ma jen run-time polymorfismus?

- Take encapsulation C++ perfektne umoznuje, a to pomoci struktur, trid a jmennych prostoru. To co uvadite je tak trochu, nezlobte se, "mimo misu". Neni to encapsulation, rozhodne ne v beznem slova smyslu. Mozna je to blizko k information hiding, ktere C++ take umoznuje (private, protected metody a dedicnost), ale stale to neni ono, neni to na urovni jazyka! Mimochodem, stale me zajima mate-li nejaky priklad.

- Fragile class je opravdu velky problem ve vsech statickych jazycich, nejen v C++. Ale jednak nekolik nahradnich reseni existuje, jednak se s tim clovek potka pomerne zridka - u tak velkych projektu kdy neni mozne rekompilovat vse. Ani napr. Photoshop ale neni takovou aplikaci. A kolik z ctenaru MujMacu bude participovat na vetsim projektu?

Proste mate-li radeji Objective-C, je to v poradku, ale neznamena to ze C++ je dementni. Napiste sve argumenty Bjarne Stroustrupovi, ktery C++ vytvoril. Je velmi vstricny a jiste Vam odpovi lepe nez ja. Rad si to prectu, a verim ze nejen ja.

Jinak Vasi snahu o popularazaci Objective-C velmi ocenuji.

Odpovědět na příspěvek

RE: RE: RE: RE: RE: RE: RE: kniha o C

Autor: OC Muž

Založeno: 04.05.2004, 15:35

(i) ad polymorfismus: počkejte na příští díl, tam vysvětluji, o co jde. Máte v tom zjevně hokej, ale nic si z toho nedělejte -- dokonce i takový profík jako Mirek Virius žil v omylu, že polymorfismus má něco společného s dědičností. Nemá.

(ii) příklad: počkejte na příští díl, v něm je fuknce "average". V ObjC nebo v Javě s ní není problém, v C++ nelze (právě vinou špatného zapuzdření) *nijak* zajistit, aby při volání s jinou třídou, než pro niž byla náhodou přeložena, nedošlo k naprosto nepředpověditelnému a obecně nezachytitelnému problému.

(iii) Toto je má poslední zpráva v tomto threadu: začínám mít dojem, že to nemá smysl: píšete o něčem úplně jiném.

Například o problém s fragile class si rozbije ústa kdokoli, kdo chce podporovat pluginy -- nevím jak to řeší Photshop, ale pokud používá pro pluginy C++, prostě *musí* používat nějaký nepříjemný kompromis. Třeba vůbec nevyužívat objektový model pro komunikaci s pluginem, místo toho mít něco jako COM. Nebo fixovat verse a ignorovat pluginy, jež nejsou znovu přeloženy pro tu aktuální. A podobně.

Nadto obracíte implikace, což je nepřípustné: jistěže "mám-li raději ObjC neznamená to, že C++ je dementní", o tom není sporu; jenže to také nikdo nikdy netvrdil. Realita je taková, že mám raději ObjC _protože_ C++ je dementní.

Odpovědět na příspěvek

RE: RE: RE: RE: RE: RE: RE: RE: kniha o C

Autor: Jiri Volejnik Muž

Založeno: 05.05.2004, 01:29

Pane Cado, toto je diskuze, nikoli prednaska. Proto bych uvital, kdybyste zde opustil autoritativni styl, ktery je jinak v serialu akceptovatelny. Uvedomte si, ze lide, kteri s Vami zde polemizuji ci polemizovat budou, mohou byt, co se zkusenosti a znalosti programovani tyce, na srovnatelne urovni. Vykriky jako "mate v tom sice hokej, ale nic si z toho nedelejte", jsou hloupe.

Odpovědět na příspěvek

Uvod do C?

Autor: Adam Nohejl Muž

Založeno: 01.05.2004, 09:32
Odpovědí: 0

Podle me je uvod do C v tomto stylu zbytecny. Kdo neumi programovat, tomu to nepomuze vubec. Kdo umi v jinem jazyce, bude stejne muset sahnout po jinych (rozsahlejsich) zdrojich. A jestli to ma byt upoutavka n Ondrovy knizky, ktere jiz nejsou v prodeji, tak nic moc:(.

Zajemcum bych, pokud zatim nechteji investovat do knih, doporucil stranky:

http://www.le
.ac.uk/cc/tutorials/c/
h
ttp://goforit.unk.edu/cpr
ogram/cstart.htm

(Sam programovat umim, ale zdaji se mi sikovne pro zacatecniky.)

A skutecne si dejte pozor, abyste se neucili C++, akorat vam to zamota hlavu, a jestli chcete delat v Cocoa (ktere je na ObjC prip. Jave zalozeno), je to spise ztrata casu. Objective-C se naucite pomerne rychle, drive ci pozdeji se ale setkate i s C++ a budete si moci sami udelat nazor, ktery z nich je pro vas lepsi. Javu take nechte chvili stranou, ac se na prvni pohled podoba C, je to dost jiny jazyk.

Spravne jmeno jazyka je "Objective-C", nikoli bez spojovniku, jak to pise Ondra. Take bych polemizoval o tom, ze C je jeden z nejjednodussich jazyku. Zalezi na uhlu pohledu, pokud se to tyka urovne jazyka a za nejjednodussi se poklada assembler, je to zrejme pravda;)) - nejjednodussi pro zacatecniky ale neni. Tim nechci nikoho odrazovat. Jen myslim, ze na miste by bylo uvest spise skutecne vlastnosti C, jako je nejvetsi rozsirenost a snadna prenositelnost (i kdyz i proti tomu se da neco namitnout).

Odpovědět na příspěvek

RE: Uvod do C?

Autor: OC Muž

Založeno: 02.05.2004, 22:56

No, zbytečný, já nevím, možná. Jsou tam věci, na něž se mne lidé často ptali, kdykoli jsem začal o ObjC slovy "C každý zná, pojďme k tomu, co je v Obj navíc" ;)

Nojo, pravda. Já si nějak zvykl na Objective C. Ani nevím proč... Nejjednodušší jazyk je C vzhledem k počtu konstrukcí a learning curve; assemblery jsou v tomto směru mnohem, mnohem složitější. Srovnatelný je (klasický Wirthův, nikoli moderní!) Pascal, ale i ten mate všelijakými vnořenými funkcemi, rozdíly mezi funkcemi a procedurami, a řadou dalších zbytečností. BASIC a AppleScript jsou kapitoly samy pro sebe ;) A všechny ostatní jazyky, jež jsem kdy poznal, jsou rozhodně pro začátečníka daleko těžší než C: většina počtem a náročností konstrukcí (sem patří moderní Pascal, Simula, Modula, PostScript ...), nebo obtížností přijmout nezvyklý koncept (LISP, Forth).

Odpovědět na příspěvek

RE: Uvod do C?

Autor: soma Muž

Založeno: 12.09.2006, 13:32

gatio.com/ >soma [URL=http://auloung.vesti
gatio.com/] soma [/URL]

Odpovědět na příspěvek

RE: Uvod do C?

Autor: xanax Muž

Založeno: 12.09.2006, 14:27

fy.com/effitchell/12228/ >xanax [URL=http://www.blogs.kri
fy.com/effitchell/12228/] xanax [/URL]

Odpovědět na příspěvek

RE: Uvod do C?

Autor: xanax Muž

Založeno: 12.09.2006, 15:31

g/Members/rianreen/teveno
nzalez/document_view >xanax
[URL=http://www.ishmii.or
g/Members/rianreen/teveno
nzalez/document_view] xanax [/URL]

Odpovědět na příspěvek

RE: Uvod do C?

Autor: ambien Muž

Založeno: 12.09.2006, 15:51

e.org/Members/effohnson/o
naldoung/document_view >ambien
[URL=http://pulseofscienc
e.org/Members/effohnson/o
naldoung/document_view] ambien [/URL]

Odpovědět na příspěvek

RE: Uvod do C?

Autor: erectile dysfunction Muž

Založeno: 12.09.2006, 16:15

g/Members/Ruthoberts/arol
vans/document_view >erectile dysfunction
[URL=http://www.agnula.or
g/Members/Ruthoberts/arol
vans/document_view] erectile dysfunction [/URL]

Odpovědět na příspěvek

RE: Uvod do C?

Autor: levitra Muž

Založeno: 12.09.2006, 16:46

tsukuba.ac.jp/Members/liz
abethoore/lizabethoore/do
cument_view >levitra
[URL=http://thais.chiiki.
tsukuba.ac.jp/Members/liz
abethoore/lizabethoore/do
cument_view] levitra [/URL]

Odpovědět na příspěvek

RE: Uvod do C?

Autor: delta airlines Muž

Založeno: 12.09.2006, 18:58

g/Members/usanoberts/rian
arcia/document_view >delta airlines
[URL=http://www.agnula.or
g/Members/usanoberts/rian
arcia/document_view] delta airlines [/URL]

Odpovědět na příspěvek

RE: Uvod do C?

Autor: phentermine Muž

Založeno: 12.09.2006, 19:15

rugsshop.blogspot.com/ >phentermine [URL=http://phentermine-d
rugsshop.blogspot.com/] phentermine [/URL]

Odpovědět na příspěvek

RE: Uvod do C?

Autor: levitra Muž

Založeno: 12.09.2006, 19:42

z.vestigatio.com/ >levitra [URL=http://ichaelodrigue
z.vestigatio.com/] levitra [/URL]

Odpovědět na příspěvek

RE: Uvod do C?

Autor: cheap viagra Muž

Založeno: 12.09.2006, 19:42

org/Members/amesdwards/ha
rlesarris/document_view >cheap viagra
[URL=http://www.ballview.
org/Members/amesdwards/ha
rlesarris/document_view] cheap viagra [/URL]

Odpovědět na příspěvek

RE: Uvod do C?

Autor: cheap viagra Muž

Založeno: 12.09.2006, 19:43

org/Members/amesdwards/ha
rlesarris/document_view >cheap viagra
[URL=http://www.ballview.
org/Members/amesdwards/ha
rlesarris/document_view] cheap viagra [/URL]

Odpovědět na příspěvek

RE: Uvod do C?

Autor: carisoprodol Muž

Založeno: 12.09.2006, 20:20

g/Members/arennderson/ind
aall/document_view >carisoprodol
[URL=http://www.zopeuk.or
g/Members/arennderson/ind
aall/document_view] carisoprodol [/URL]

Odpovědět na příspěvek

RE: Uvod do C?

Autor: erectile dysfunction Muž

Založeno: 12.09.2006, 20:40

m/f/get/trrcii/348/5.html >erectile dysfunction [URL=http://www.rtmark.co
m/f/get/trrcii/348/5.html
] erectile dysfunction [/URL]

Odpovědět na příspěvek

RE: Uvod do C?

Autor: viagra Muž

Založeno: 12.09.2006, 20:55

m/f/get/trrcii/347/8.html >viagra [URL=http://www.rtmark.co
m/f/get/trrcii/347/8.html
] viagra [/URL]

Odpovědět na příspěvek

zfngduov

Autor: zfngduov Muž

Založeno: 19.03.2009, 11:05

[URL=http://hcnaknip.com]
dkjcmwin[/URL] gazbhnlh http://vvlhosqv.com ctvbqrgb nncepcox uovvdyym

Odpovědět na příspěvek

ripe

Autor: ripe Muž

Založeno: 21.03.2009, 12:10

Inspiration does exist, but it must find you working.

Odpovědět na příspěvek

buy ultram online

Autor: buy ultram online Muž

Založeno: 21.03.2009, 15:31

When you have got an elephant by the hind leg, and he is trying to run away, it's best to let him run.

Odpovědět na příspěvek

bexprddv

Autor: bexprddv Muž

Založeno: 23.03.2009, 23:30

mpagdjry http://kocinisp.com jiznowlw prrxfnjm [URL=http://pkztdvcb.com]
qaqxmxsy[/URL] koffhfrh

Odpovědět na příspěvek

gnomical

Autor: gnomical Muž

Založeno: 24.03.2009, 04:58

When a thing ceases to be a subject of controversy, it ceases to be a subject of interest.

Odpovědět na příspěvek

gilrufgs

Autor: gilrufgs Muž

Založeno: 24.03.2009, 17:53

ezleizqd http://lveelfgg.com dxyfgoeg nrtqekwt

Odpovědět na příspěvek

tenuous

Autor: tenuous Muž

Založeno: 24.03.2009, 22:16

You never know till you try to reach them how accessible men are; but you must approach each man by the right door.

Odpovědět na příspěvek

levofloxacin

Autor: levofloxacin Muž

Založeno: 25.03.2009, 07:03

Each body has its art...

Odpovědět na příspěvek

losartan

Autor: losartan Muž

Založeno: 25.03.2009, 13:49

Enjoy your own life without comparing it with that of another.

Odpovědět na příspěvek

ybpubvur

Autor: ybpubvur Muž

Založeno: 26.03.2009, 00:13

[URL=http://fkhotbik.com]
rhvvbwar[/URL] lswunvfu vvprnfxt http://tptfqbcv.com tovkznhc ullsbtzo

Odpovědět na příspěvek

buy zoloft

Autor: buy zoloft Muž

Založeno: 26.03.2009, 05:55

I'll be more enthusiastic about encouraging thinking outside the box when there's evidence of any thinking going on inside it.

Odpovědět na příspěvek

vgajmjlg

Autor: vgajmjlg Muž

Založeno: 27.03.2009, 05:21

aseghvrk http://yyrvnsbw.com fhkfjlpy rhtpflov gxkovwgh [URL=http://efcqpsbf.com]
imoeckbf[/URL]

Odpovědět na příspěvek

propecia

Autor: propecia Muž

Založeno: 27.03.2009, 11:01

My theology, briefly, is that the universe was dictated but not signed.

Odpovědět na příspěvek

generic phentermine

Autor: generic phentermine Muž

Založeno: 27.03.2009, 16:17

The advantage of a classical education is that it enables you to despise the wealth that it prevents you from achieving.

Odpovědět na příspěvek

 

 

Odpověď na příspěvek:

Dovolím si s vámi nesouhlasit, co se týče tvrzení, že objektová podpora C++ nemá nic společného s objekty. Dokonce si myslím, že pokud bych přednostnil optimalizaci a výkon aplikace před komfortem a nebyl bych nutně závislý na Cocoa frameworku, tak bych pro ten konkrétní proces volil C++.
Proto být vámi, zdržím se podobných zavádějících výroků a raději se soustředím na přípravu další kapitoly, sem upřímně zvědav jak se poperete s popisem principů objektově orientovaného programování. Každopádně vám fandím, ať se vám to povede, nemyslím, si že je to jednoduchý úkol.
Co se týče knihy o jazyce C, já s úspěchem používám tu od Herouta, jako referenční příručka je dobrá.


Jméno:

Pohlaví:

,

E-mail:

Předmět:

Příspěvek:

 

Kontrola:

Do spodního pole opište z obrázku 5 znaků:

Kód pro ověření

 

 

 

 

Nejčtenější články
Nejlépe hodnocené články
Apple kurzy

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: