C/C++ programozás tanulása

 ( gd | 2009. július 4., szombat - 18:10 )

Sziasztok!

Milyen könyvet és/vagy weboldalt javasoltok C++ programozás tanulására a gyakorlatban? A szintaxis átismétlése mellett érdekelne
- Standard ill. GNU C/C++ könyvtárak, STL, ...
- library-k írása és használata, statikus/dinamikus linkelés, make, Makefile-ok
- mikre kell még odafigyelni a gyakorlatban C++ program írásakor és terjesztésekor (főleg Linux ill. nyílt forrású programozás érdekel).

Köszönöm.

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Hát ennek egy jó részére nem tudok mit mondani, de én Bjarne Stroustrup The C++ Language című könyvéből tanultam.

makefile-t meg man-ból, STL-t sgi-s doksiból (weben)
trükköket meg projektben dolgozva tapasztaltabb kollégáktól

A libes kérdést nem teljesen értem. Az olyasmi, mint más nyelven, csak pl. C++ esetén ha más fordítóval fordítod, a szimbólumok eltérhetnek (ha jól emlékszem akkor pl. C-ben ez szabványosított, tehát ott nincs gond fordítók mixeléséből)

G

Köszönöm. A szintaxist ebből tanultam pár éve (kölcsönkapott példányból, a tartalomjegyzék alapján talán nem a 3. kiadás volt).

"Az olyasmi, mint más nyelven"

Hát, compiler nyelvek közül csak a Pascalt ismerem, ott ezekre (statikus könyvtár felhasználsa, dinamikus könyvtár felhasználása, program helyett dinamikus könyvtár készítése, statikusan felhasználható unit készítése) külön nyelvi szerkezetek vannak. Ilyenekkel a C++ szintaxisban nem találkoztam. (C++-ban statikusan ugye header fájlokkal használok fel egy könyvtárat, de hogy a fordító honnan tudja, vagy hogy mondom meg neki, hogy melyik forrásfájlt kell hozáfordítani, az már homályos. Pascalban nincs külön forrás és header; ha megadom a unitot uses-zel, egyértelmű, hogy mit linkel hozzá a fordító.)

Na OK, akkor linkelés:

Van egy library, mindegy, hogy statikus, vagy dinamikus, ami egy lefordított bináris cucc.
A library-hoz tartozik header file, ami gyakorlatilag felsorolja, hogy mik azok, amiket te kívülről látsz.

A programodba beincludeolod a headert, ezzel a fordítás rész lemegy.

Fordítás után az objekt fájlokból még valami futtathatót kell linkelned (ezt a gcc megcsinálja, akár egy parancsra is, de akkor is külön lépés).

Amikor linkelsz, akkor meg kell mondani, hogy melyik statikus libet (könyvtár.a), vagy dinamikus libet (könyvtár.so) akarod a programhoz linkelni.

Ha statikusan linkelsz egy objektumot, akkor abból amit a programod használ, azt hozzámásolja a végtermékhez, és amikor a programod fut, akkor a fájlon belül megtalálja.
Ha dinamikusan linkelsz, akkor csak eltárolja a fájlnevet, és amikor a programot elindítod, akkor a dinamikus linker megpróbálja megkeresni neked azt a fájlt, amit fordításkor adtál meg neki. Ha nem található, hibaüzenetet kapsz, ha megvan, betölti, és induláskor térképezi fel, hogy akkor az adott függvény hol található.

Ehhez neked program írása közben nem kell figyelned, mindegy, hogy a függvényt te írtad egy másik forrásfájlban vagy valaki más, és te csak a libet használod, a szintaktika ugyanaz.

Emellett még lehet futás közben is megnyitni dinamikus libet, és megkeresni benne szimbólumot, majd oda ugrani, de szerintem neked most nem ez kell. Ez akkor lehet érdekes, ha mondjuk menet közben betölthető és cserélhető modult készítesz, plugint, ilyesmit.

Köszönöm. Azt jól látom, hogy akkor azt is gcc opcióban kell megadni, hogy statikus vagy dinamikus libet akarok csinálni egy forrásfájlból?

igen, alapértelmezetten dinamikus, ezt tudod felülbírálni azzal hogy -static(bár ez függ attól hogy hogyan paraméterezed a többi részét)

En STL referencianak ezeket az oldalakat szoktam hasznalni:

http://www.cppreference.com/wiki/
http://cplusplus.com/reference/

A masodik talan kicsit hasznalhatobb: jobban el van latva peldakkal, meg ilyenek.
--
ahan nem

Énnekem ez a könyv van meg: Tóth Bertalan - Programozzunk C++ nyelven. Elég jó kis könyv.
http://www.computerbooks.hu/PrC++/

---------------------------
Az otthoni statikus IP címem: 127.23.125.76

Bocs, kicsit off, meg már októberben nem friss a reakcióm, de nem tudja valaki, hogy a "programozzunk c++ nyelven!" c. - amúgy tényleg jó könyv - miért ír MINDEN main() függvényt voidnak?? Bárhol máshol tanultam, mindig int volt a visszatérési értéke... És a fordító is hibásnak vette, amit nem is csodálok.
Tud valaki erre magyarázatot amit megosztana velem?

Üdv: svarc

Ha jól emlékszem -- már régen volt --, akkor windows alatt void main()-el is lefordul a program.
Talán a szerző windows használt.

Nemtudom, Bloodshed Dev C++ -szal és Code::Blocks-szal is teszteltem, xp alatt nem fordul le. Lehet, hogy a mégkorábbiaknál, a 9x alatt esetleg.
De az ötlet jó!

Az említett könyv valószínűleg Turbo/Borland programokkal példálózik. Szerintem ott még a void is megy.
Amúgy a szerző valószínűleg nem gondolt arra, hogy minden program egy függvény ami egy hibakódot ad vissza.
--
http://pc.rulz.hu
не закурить! (Ne gyújts rá!) не куриться! (Ne dohányozz! Ne füstölögj!)

GCC elfogad void visszatérési értékű main-t, csak figyelmeztet, hogy nem így szokás.
--
Keep it simple, stupid.

Jah, ez nekem is feltünt, de én int-et használtam mindig, az egyetemen így tanították és a szokás hatalma, amúgy jó kis könyv, nekem bejött.

Mert a szerző egy... khm.

Mondanám, hogy egy régi motoros, aki még Turbo C++-n szocializálódott, ami az akkor még nem alig létező szabványt sem támogatta.

Csak hát a könyv (utolsó?) kiadása 2003-as, alcíme meg az, hogy: "Az Ansi C++ tankönyve". Márpedig olyan C++ szabvány nincs, ami a void visszatérést engedi a main-ből.

Így inkább nem mondok a szerzőről semmit...

"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o

sokan helytelenul void-oznak. errol van egy eleg jo iras: link

egyebkent meg senkinek nem ajanlom a 24 ora alatt programozzunk konyveket, semmilyen nyelven (mondjuk amit te irtal, ha jol emlekszem, nem 24 oras, de computerbook-os :))

---
Egy jól megállapított probléma félig megoldott probléma.
- Charles Kettering

"...nem 24 oras, de computerbook-os"

Bátor volnék megemlíteni, hogy az általad a jelek szerint nem túl nagyra becsült 24 órás sorozatot a Kiskapu adja ki, nem a ComputerBooks. :-)

Egyébiránt ez a sorozat kifejezetten kezdőknek szól, és általában addig jut el, hogy az olvasó képes legyen belevágni egy következő, középhaladóknak/profiknak szóló könyvbe.

---
Science for fun...

akkor erhet valamit, ha a kezdo utana tenyleg olvas kovetkezo konyve(ke)t. azonban a magasabb szintu konyvek eleje kb megegyezik ezekkel a kezdo konyvekkel (szigoruan szubjektiv velemeny). ami miatt jok lehetnek a 21 napos konyvek, az a sok peldakod

"Bad programming is easy. Idiots can learn it in 21 days, even if they are Dummies." - How to Design Programs

---
Egy jól megállapított probléma félig megoldott probléma.
- Charles Kettering

Nem tudom, a Tanuljunk programozni Perl-ul 21 nap alatt cimu konyv hihetetlen profi. En pl. gyak. azt hasznalom regex referenciakent, annyira jo az a fejezet benne.
--

()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

Köszi a tippet! Találtam már regexp (én pével mondom:) ) howtokat már, de mindig is áhítottam egy részletes leírást. Meg is szerzem a könyvet :)

--
Hogyha III. András 5 év alatt 15 törvényt adott ki, akkor 25 év alatt 50 törvényt hanyadik Béla adott ki?

man 7 regex
osszesen 2 oldal es minden benne van (gondolom)

- Use the Source Luke ! -

Rosszul gondolod. Perl regexp ill. PCRE sokkal komolyabb, mint a POSIX.

Ebben messze nincs benne minden a Perl típusú reguláris kifejezésekről, csak a (kevesebb lehetőséget tartalmazó) POSIX szabványos regexpekről. A Perl-kompatibilis regexpeket én innen tanultam, de valószínűleg még jobb egy Perl-es leírás.

Itt találsz egy csomó mindent:
http://www.informit.com/guides/guide.aspx?g=cplusplus

Elég jó, bár volt már amivel nem értettem egyet. De egy kezdőnek oké...

"mikre kell még odafigyelni a gyakorlatban C++ program írásakor"

Ezek elég hasznosak, főleg az első:
Scott Meyers: Hatékony C++ aka. Effective C++
Scott Meyers: More Effective C++
Stephen C. Dewhurst: C++ Hibaelhárító

"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o

Annyit tennék hozzá, hogy a Scott Meyers féle Hatékony C++-ból több kiadás is van, az alcímet érdemes nézni: én magyarul még csak az "50 jó tanács programjaink és programterveink javítására" alcíművel találkoztam, de van már újabb kiadás is, abban már 55 jó tanács van - viszont nem tudom hogy az is kapható-e magyarul.

Igazából majdnem mindegy, kb. ugyanazok vannak az összes kiadásban, maximum van amit szétbontott több tanácsra.

Az igazán új tanácsok a More Effective C++-ban vannak.

"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o

Köszönöm a válaszokat, azt hiszem, beszerzem a Stroustrup könyvet, aztán referenciának jók lesznek, amiket Toxyc írt. A make-nek meg a különböző Makefile-generáló rendszereknek pedig megpróbálok utánanézni. Azért ha valakinek van még jó tippje, ne tarts magában. :)

ment mail
___
info

Szerintem a Stroustrup konyve helyett inkabb a tr3w hsz-eben levoket szerezd be!

----------------------
"ONE OF THESE DAYS I'M GOING TO CUT YOU INTO LITTLE PIECES!!!$E$%#$#%^*^"

Szerintem Stroustrup könyve alap.

Egy baj van vele: nagyon tömör. (Igen, még így is 1000+ oldal. A C++ nehéz nyelv...)
Talán pont a Hatékony C++-ban van egy példa, miszerint a Stroustrup könyvben van egy egy soros komment egy példaprogramban, addig ugyanaz a téma a Meyers könyvben 4 oldal.

A Stroustrup könyv első könyvnek éppen ezért szerintem nem jó. Arra van kismillió másik könyv, én anno egy Computerbooks kiadványból kezdtem.

Ezután el lehet kezdeni használni (Qt, akármi).

Utána úgyis előjönnek olyan dolgok, amik nem világosak, vagy nem érhető miért pont úgy kell, stb. Ekkor jön a Stroustrup könyv, amiben szinte mindenre ott a válasz.

Ha csak gyors válasz kell valami C++-os problémára:
http://www.parashift.com/c++-faq-lite/index.html

Ha ezek után még tovább szeretnéd javítani a kódod minőségét, akkor jöhetnek azok a könyvek amiket ajánlottam.
Talán a Hatékony C++ olyan, amit előrébb lehet venni, mondjuk a Stroustruppal párhuzamosan. Ezekre úgyis azt ajánlják, hogy mindig azt olvasd el, ami éppen kell, ne az egészet egyvégtében.

"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o

Hali,

Ha érdekel a Stroustrup könyv, van egy eladó nálam.

--
Keep it simple, stupid.

Nalam meg egy pm-ben elkerheto.
--

()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

pdf?:)

CMake minden kezdo baratja szerintem. http://cmake.org
--

()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

Sokéves C és Python tapasztalat után februárban én is elkezdtem C++-ul tanulni, és a diplomamunkámhoz tartozó kb. 10000 soros szimulációs kód nagy részét is ebben írtam.

Referenciának a már említett www.cplusplus.com és a Bjarne Stroustrup-féle "biblia" vált be, kedvelem benne azt a szemléletet, h adott problémára felvázol 3-4 megoldási módszert, rosszakat, jókat, majd mindegyiket diszkutálja. Ez valamelyest vezeti az embert a programozási szokás kialakulásában. Hozzá kell tegyem, még így is könnyen lehet gány kódot írni :)

Speciálisan az én felhasználási területemhez (fizikai problémák szám.gépes modellezése) még jól jött a Barton--Nackman-féle "Scientific and Engineering C++" is.

Fordításhoz nálam a sima makefile-írás + make-nél jobban bevált a cmake ( www.cmake.org ) használata, mikor már a program tekintélyes méretűre hízott. Nem állítom, h kezdőknek a legfelhasználóbarátabb az oldal és a dokumentáció, de némi böngészgetés után bele lehet tanulni. Hozzá kell tennem, h én nem használtam semmilyen kimondottan fejlesztői környezetet, Geany editor volt a barátom.

Ja, még ezt az oldalt is hasznos volt olvasgatnom:
http://www.parashift.com/c++-faq-lite/index.html

A tr3w által említett könyveket én nem olvastam (még), több helyen ajánlották, érdemes lehet nekik figyelmet szentelni.

Ez nagyon kemény, meg a hozzászólások is :D

http://www.youtube.com/watch?v=xF0-LGoXtaw

--
Keep it simple, stupid.

Ez nagyon jó és valahol a neten ingyen is letölthető, de már nem emléxem hol. Én még megvettem anno >10K HUF áron.
ISBN 0-201-70353-X
És ez is jó:
ISBN 978-963-9131-94-1
--
unix -- több, mint kód. filozófia.
Life is feudal

Van egy Bányász Gábor - Levendovszky Tihamér: Linux programozás c. BME jegyzet, egy korai verziója a neten is kering. Ez épít arra, hogy már megvannak a C/C++ alapok.

És van egy Benedek Zoltánnal közös műve is Levendovszky Tihamérnak:
ISBN 978-963-9131-94-1
--
unix -- több, mint kód. filozófia.
Life is feudal

Amúgy úgylátom, senki nem említette de nem rossz könyv a "Tanuljuk meg a c++ programozási nyelvet 24 óra alatt" sem. Sőt, kifejezetten jó.
--
Hogyha III. András 5 év alatt 15 törvényt adott ki, akkor 25 év alatt 50 törvényt hanyadik Béla adott ki?

http://gotapi.com

Ez inkább amolyan segítség prorgamozás közben, de tanuláshoz is jó (ha már elértél egy szintet).

--
Keep it simple, stupid.

Makefájlokkal szerintem tanulási fázisban nem érdemes kínlódni.
Értelmesebb dolog inkább egy normális Linux IDE használata

A topicot annak idején azért nyitottam, mert, míg a szintaxist már alapvetően ismertem, az érdekel, hogy a gyakorlatban hogy működik egy C++ program fejlesztése. Így ha pl. egy meglévő projecthez akarok patchet írni, akkor nem tehetem úgy, hogy csak az általam kiválasztott kényelmes IDE-ben tudok magamnak programocskákat írni, de fogalmam nincs egy nagyobb project összeépítéséről. Mindenesetre a legfontosabb dolgokra, amikre kiváncsi voltam a dologgal kapcsolatban, már választ kaptam.

OK, ez esetben nem árt ismerni a GNU Autoconf - Automake rendszert és az M4 makrónyelvet. A nagyobb GPL-es projectek majdnem mind ezeket használják. Két projectet vittem végig ezekkel, de az a véleményem, hogy ha nem létszükséglet, akkor jobb, ha az ember valami mást próbál használni.
Build rendszerek közül nekem pl. scons jobban tetszett, az viszonylag egyszerű.
A vicc az, hogy mióta nagyobb projectekben veszek részt, kizárólag IDÉ-ket használunk, mert a hatékonyság nagyon fontos. Azóta szerencsére kezdem is autotools és scons dolgait elfelejteni.

Köszönöm a tanácsokat, akkor majd helyzettől függően beletanulok ezekbe, meg a mostanában szintén népszerűnek tűnő cmake-be.

cmake FTW!
scons esetleg akkor, ha érdekel vagy ismered a Python-t.

Nekem Code::Blocks jött be nagyon, főleg mert windozra és debianra is van.
(Ezt a jótulajdonságát nem tudtam még teljesen kihasználni, a debugger ugyanis nem müxik debian alatt. Erősen gondolkodom a topicnyitáson, de még pár napig keresgélek.)
Ez az Ultimate++ viszont nagyon összetett kis környezetnek tűnik, van benne minden.
--
Hogyha III. András 5 év alatt 15 törvényt adott ki, akkor 25 év alatt 50 törvényt hanyadik Béla adott ki?

subscribe

// jaxx

Nagyon jo konyv meg az "Accelerated C++", en most ebbol tanulok. Szerzok: Andrew Koenig es Barbara E. Moo. Mar az elejen behozza az STL alapokat (vector, string), szerencsere nem az osi C-s dolgokat sulykolja. Az elso szerzo, Andrew Koenig, az STL konyvtaron is dolgozott annak idejen, szoval tudja, hogy mirol beszel :)

pontosan
És jól ír. Jó stílusban. Élvezet olvasni is.
--
unix -- több, mint kód. filozófia.
Life is feudal

Nem akartam új topciot nyitni, de ANSI C tanulásához keresek olyan könyvet, ami legalább O'Reilly mélységig taglalja a nyelvet. Sajnos nem igen találtam, csak az C in a Nutshell-t, de két dolog miatt nem veszem meg: drága és angol. Pedig nagyon jó... Na a lényeg, hogy valami hasonlót keresek. Nem tudom, hogy a Pere László féle C könyv mennyire megy bele a nyelvbe - számomra nem fontos, hogy ismerjem a GNU C-t.
--
Azt akarom, hogy az emberek ne kényszerből tanuljanak, hanem azért, mert tudni akarnak.

és angol

Ne tanulj angolul, magyar a vilagnyelv, kulfoldi kliensek is megtanuljak elobb-utobb, meg minden leiras elerheto magyarul, stb.

---------------------
"ONE OF THESE DAYS I'M GOING TO CUT YOU INTO LITTLE PIECES!!!$E$%#$#%^*^"

...nem arról van szó, hogy nem értem meg az angol szöveget, hanem arról, hogy ha valamit félreértek, akkor rosszul tanulom meg. És ha létezik magyarul ilyen könyv, akkor miért ne használjam azt?
--
Azt akarom, hogy az emberek ne kényszerből tanuljanak, hanem azért, mert tudni akarnak.

Ma van akkor, ha az ember tud angolul, el is olvasott már néhány szakkönyvet ezen a nyelven, de mégis ötször olyan gyorsan olvas magyarul? Akko kell más okot találni, hogy belekössünk, vagy még mindig a szánalmas kategóriában van?

KisKresz

de mégis ötször olyan gyorsan olvas magyarul

Akkor van egy nyomos ok meg tobb idot fektetni az angol gyakorlasaba! ;^) A profi angol nyelvtudassal sokkal tobbre fog menni, mint a C-vel...

----------------------
"ONE OF THESE DAYS I'M GOING TO CUT YOU INTO LITTLE PIECES!!!$E$%#$#%^*^"

Hát nem tudom. Ez az én esetemben nagyon nem így van.

KisKresz

Egy éve még én is nehezen boldogultam az angol nyelvvel, de gyakorlatilag az elmúlt évben csak angolul néztem filmeket, és RENGETEGET olvastam angolul. Mára könnyedén szólalok meg, és tökéletesen megértem az angol szöveget. Tényleg csak egy kis energiát kell belefektetni, és nem kéne hagyni, hogy a lustaság győzzön. ;)
--
"Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live." John F. Woods

Nem ismerem, de ezt találtam: Programfejlesztés C nyelven
A letölthető tartalomjegyzék alapján elég alaposnak tűnik.
Szakirodalmat először mindig a Kiskapunál keresek. Aztán jöhet a Panem.
--
Tertilla; Tisztelem a botladozó embert és nem rokonszenvezem a tökéletessel! Hagyd már abba és kész!

Szerintem jó könyv.
Jöhetne C++ nyelven is egy ilyen!

--
unix -- több, mint kód. filozófia.
Life is feudal

Nyugodtan olvass angol nyelvű könyveket, mert úgyis csak annak lehet hinni, amit a gépeden kipróbálsz.
--
unix -- több, mint kód. filozófia.
Life is feudal

Erről tud-e valaki mondani pár tapasztalatot?
Stephen G. Kochan - Programfejlesztés C nyelven
--
Azt akarom, hogy az emberek ne kényszerből tanuljanak, hanem azért, mert tudni akarnak.

Napok óta olvasgatom. Remek könyv. Bár találsz benne gcc-s dolgokat is, nem lesz károdra. (gdb-ről nem is beszélve). Természetesen Pere László könyvét is ajánlom! Annak ellenére, hogy gcc. Mindkettőt nézd át és az a legfontosabb, hogy mindent próbálj ki saját magad is, mert abból lehet a legtöbbet tanulni.
--
unix -- több, mint kód. filozófia.
Life is feudal

Arra lennék kíváncsi, hogy ez mennyire 'advanced', azaz, hogy az alap dolgoknál mennyivel mond többet? Például említi-e, hogy a definíciókat a kódblokk elejére kell tenni, ezért ha funkció hívása után szeretnénk új változót deklarálni, akkor új kódblokkot kell-e nyitni. Vagy hogy hogyan hozhatunk létre dinamikus tömböt? Vagy például mikor érdemes globális változókat használni? A lényeg, hogy nem 'Hogyan kezdjünk C programnyelven programozni' jellegű könyvet keresek, hanem valami hasonlót, mint Nyisztor Károly Gyakorlati C++ - rejtett lehetőségek, különleges megoldások c. könyve, ahol (hülyén fogalmazva) hacker-szinten ismertetik a nyelvet.
--
Azt akarom, hogy az emberek ne kényszerből tanuljanak, hanem azért, mert tudni akarnak.

nem lesz károdra
Én kivettem könyvtárból és a BP-re hévezés alatt remek időtöltésnek találtam olvasgatni ezt a könyvet. Vedd ki te is könyvtárból és döntsd el, hogy meg akarod-e venni. Szerintem jó könyv és érdemes elolvasnod. Nem tudom, hogy mindenre választ kapsz-e belőle a kérdéseidre, de szerintem igen. Mutatókat elég részletesen taglalja. És sok más, hasznos dolgot is. Pölö MinGW.
[szerk] MinGW csak említve van benne.
--
unix -- több, mint kód. filozófia.
Life is feudal

Bocsánat! Eljárt a kezem, kétszer küttem be.
--
unix -- több, mint kód. filozófia.
Life is feudal