C/C++ programozás tanulása

Fórumok

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ások

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.

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

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!)

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

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. :)

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

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 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.

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.

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?

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 :)

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.

...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.

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$%#$#%^*^"

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!

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