Mechatronikai rendszerek programozása C++ nyelven

Tamás, Péter

Molnár, József

Devecseri, Viktor

Gräff, József

A tananyag a TÁMOP-4.1.2.A/1-11/1-2011-0042 azonosító számú „ Mechatronikai mérnök MSc tananyagfejlesztés ” projekt keretében készült. A tananyagfejlesztés az Európai Unió támogatásával és az Európai Szociális Alap társfinanszírozásával valósult meg.

Kézirat lezárva: 2014 február

Lektorálta: Tóth Bertalan

A kiadásért felel a(z): BME MOGI

Felelős szerkesztő: BME MOGI

2014


Tartalom
I. A C++ alapjai és adatkezelése
I.1. A C++ programok készítése
I.1.1. Néhány fontos szabály
I.1.2. Az első C++ program két változatban
I.1.3. C++ programok fordítása és futtatása
I.1.4. A C++ programok felépítése
I.2. Alaptípusok, változók és konstansok
I.2.1. A C++ adattípusok csoportosítása
I.2.1.1. Típusmódosítók
I.2.2. Változók definiálása
I.2.2.1. Változók kezdőértéke
I.2.3. Az alaptípusok áttekintése
I.2.3.1. Karakter típusok
I.2.3.2. A logikai bool típus
I.2.3.3. Az egész típusok
I.2.3.4. A lebegőpontos típusok
I.2.3.5. Az enum típus
I.2.4. A sizeof művelet
I.2.5. Szinonim típusnevek készítése
I.2.6. Konstansok a C++ nyelvben
I.3. Alapműveletek és kifejezések
I.3.1. Az operátorok csoportosítása az operandusok száma alapján
I.3.2. Elsőbbségi és csoportosítási szabályok
I.3.2.1. A precedencia-szabály
I.3.2.2. Az asszociativitás szabály
I.3.3. Matematikai kifejezések
I.3.3.1. Aritmetikai operátorok
I.3.3.2. Matematikai függvények
I.3.4. Értékadás
I.3.4.1. Balérték és jobbérték
I.3.4.2. Mellékhatások a kiértékelésekben
I.3.4.3. Értékadó operátorok
I.3.5. Léptető (inkrementáló/dekrementáló) műveletek
I.3.6. Feltételek megfogalmazása
I.3.6.1. Összehasonlító műveletek
I.3.6.2. Logikai műveletek
I.3.6.3. Rövidzár kiértékelés
I.3.6.4. A feltételes operátor
I.3.7. Bitműveletek
I.3.7.1. Bitenkénti logikai műveletek
I.3.7.2. Biteltoló műveletek
I.3.7.3. Bitműveletek az összetett értékadásban
I.3.8. A vessző operátor
I.3.9. Típuskonverziók
I.3.9.1. Implicit típus-átalakítások
I.3.9.2. Explicit típus-átalakítások
I.4. Vezérlő utasítások
I.4.1. Az üres utasítás és az utasításblokk
I.4.2. Szelekciós utasítások
I.4.2.1. Az if utasítás
I.4.2.2. A switch utasítás
I.4.3. Iterációs utasítások
I.4.3.1. A while ciklus
I.4.3.2. A for ciklus
I.4.3.3. A do-while ciklus
I.4.3.4. A brake utasítás a ciklusokban
I.4.3.5. A continue utasítás
I.4.4. A goto utasítás
I.5. Kivételkezelés
I.5.1. A try – catch programszerkezet
I.5.2. Kivételek kiváltása – a throw utasítás
I.5.3. Kivételek szűrése
I.5.4. Egymásba ágyazott kivételek
I.6. Mutatók, hivatkozások és a dinamikus memóriakezelés
I.6.1. Mutatók (pointerek)
I.6.1.1. Egyszeres indirektségű mutatók
I.6.1.2. Mutató-aritmetika
I.6.1.3. A void * típusú általános mutatók
I.6.1.4. Többszörös indirektségű mutatók
I.6.1.5. Konstans mutatók
I.6.2. Hivatkozások (referenciák)
I.6.3. Dinamikus memóriakezelés
I.6.3.1. Szabad memória foglalása és elérése
I.6.3.2. A lefoglalt memória felszabadítása
I.7. Tömbök és sztringek
I.7.1. A C++ nyelv tömbtípusai
I.7.1.1. Egydimenziós tömbök
I.7.1.1.1. Az egydimenziós tömbök inicializálása és értékadása
I.7.1.1.2. Egydimenziós tömbök és a typedef
I.7.1.2. Kétdimenziós tömbök
I.7.1.3. Változó hosszúságú tömbök
I.7.1.4. Mutatók és a tömbök kapcsolata
I.7.2. Dinamikus helyfoglalású tömbök
I.7.2.1. Egydimenziós dinamikus tömbök
I.7.2.2. Kétdimenziós dinamikus tömbök
I.7.3. A vector típus használata
I.7.3.1. Egydimenziós tömbök a vektorban
I.7.3.2. Kétdimenziós tömb vektorokban
I.7.4. C-stílusú sztringek kezelése
I.7.4.1. Sztringek egydimenziós tömbökben
I.7.4.2. Sztringek és a pointerek
I.7.4.3. Sztringtömbök használata
I.7.5. A string típus
I.8. Felhasználói típusok
I.8.1. A struktúra típus
I.8.1.1. Struktúra típus és struktúra változó
I.8.1.2. Hivatkozás a struktúra adattagjaira
I.8.1.3. Egymásba ágyazott struktúrák
I.8.1.4. Struktúrák és tömbök
I.8.1.4.1. Tömb, mint struktúratag
I.8.1.4.2. Struktúra, mint tömbelem
I.8.1.5. Egyszeresen láncolt lista kezelése
I.8.2. A class osztály típus
I.8.3. A union típus
I.8.3.1. Névtelen uniók használata
I.8.4. Bitmezők használata
II. Moduláris programozás C++ nyelven
II.1. Függvények - alapismeretek
II.1.1. Függvények definíciója, hívása és deklarációja
II.1.2. Függvények visszatérési értéke
II.1.3. A függvények paraméterezése
II.1.3.1. A paraméterátadás módjai
II.1.3.1.1. Érték szerinti paraméterátadás
II.1.3.1.2. Referencia szerinti paraméterátadás
II.1.3.2. Különböző típusú paraméterek használata
II.1.3.2.1. Aritmetikai típusú paraméterek
II.1.3.2.2. Felhasználói típusú paraméterek
II.1.3.2.3. Tömbök átadása függvénynek
II.1.3.2.4. Sztring argumentumok
II.1.3.2.5. A függvény, mint argumentum
II.1.3.2.5.1. A függvénytípus és a typedef
II.1.3.2.5.2. Függvényre mutató pointerek
II.1.3.2.5.3. Függvényre mutató pointer példák
II.1.3.2.6. Alapértelmezés szerinti (default) argumentumok
II.1.3.2.7. Változó hosszúságú argumentumlista
II.1.3.2.8. A main() függvény paraméterei és visszatérési értéke
II.1.4. Programozás függvényekkel
II.1.4.1. Függvények közötti adatcsere globális változókkal
II.1.4.2. Függvények közötti adatcsere paraméterekkel
II.1.4.3. Egyszerű menüvezérelt programstruktúra
II.1.4.4. Rekurzív függvények használata
II.2. A függvényekről magasabb szinten
II.2.1. Beágyazott (inline) függvények
II.2.2. Függvénynevek átdefiniálása (túlterhelése)
II.2.3. Függvénysablonok
II.2.3.1. Függvénysablonok készítése és használata
II.2.3.2. A függvénysablon példányosítása
II.2.3.3. A függvénysablon specializálása
II.2.3.4. Néhány további függvénysablon példa
II.3. Névterek és tárolási osztályok
II.3.1. A változók tárolási osztályai
II.3.1.1. A változók elérhetősége (hatóköre) és kapcsolódása
II.3.1.2. A változók élettartama
II.3.1.3. A blokk szintű változók tárolási osztályai
II.3.1.3.1. Az automatikus változók
II.3.1.3.2. A register tárolási osztály
II.3.1.3.3. Statikus élettartamú lokális változók
II.3.1.4. A fájl szintű változók tárolási osztálya
II.3.1.5. A program szintű változók tárolási osztálya
II.3.2. A függvények tárolási osztályai
II.3.2.1. A lefordított C függvények elérése C++ programból
II.3.3. Több modulból felépülő C++ programok
II.3.4. Névterek
II.3.4.1. A C++ nyelv alapértelmezett névterei és a hatókör operátor
II.3.4.2. Saját névterek kialakítása és használata
II.3.4.2.1. Névterek készítése
II.3.4.2.2. Névtér azonosítóinak elérése
II.3.4.2.3. Névterek egymásba ágyazása, névtér álnevek
II.3.4.2.4. Névtelen névterek
II.4. A C++ előfeldolgozó utasításai
II.4.1. Állományok beépítése
II.4.2. Feltételes fordítás
II.4.3. Makrók használata
II.4.3.1. Szimbolikus konstansok
II.4.3.2. Paraméteres makrók
II.4.3.3. Makrók törlése
II.4.3.4. Makróoperátorok
II.4.3.5. Előre definiált makrók
II.4.4. A #line, az #error és a #pragma direktívák
III. Objektum-orientált programozás C++ nyelven
III.1. Bevezetés az objektum-orientált világba
III.1.1. Alapelemek
III.1.2. Alapvető elvek
III.1.2.1. Bezárás, adatrejtés (encapsulation , data hiding)
III.1.2.2. Öröklés (inheritance)
III.1.2.3. Absztrakció (abstraction)
III.1.2.4. Polimorfizmus (polymorphism)
III.1.3. Objektum-orientált C++ programpélda
III.2. Osztályok és objektumok
III.2.1. A struktúráktól az osztályokig
III.2.1.1. Egy kis ismétlés
III.2.1.2. Adatok és műveletek egybeépítése
III.2.1.3. Adatrejtés
III.2.1.4. Konstruktorok
III.2.1.4.1. Taginicializáló lista alkalmazása
III.2.1.4.2. Az objektumok explicit inicializálása
III.2.1.5. Destruktor
III.2.1.6. Az osztály objektumai, a this mutató
III.2.2. Az osztályokról bővebben
III.2.2.1. Statikus osztálytagok
III.2.2.2. Az osztályok kialakításának lehetőségei
III.2.2.2.1. Implicit inline tagfüggvények alkalmazása
III.2.2.2.2. Osztálystruktúra a C++/CLI alkalmazásokban
III.2.2.2.3. A tagfüggvények tárolása külön modulban
III.2.2.3. Barát függvények és osztályok
III.2.2.4. Mi szerepelhet még az osztályokban?
III.2.2.4.1. Objektumok konstans adattagjai
III.2.2.4.2. Hivatkozás típusú adattagok
III.2.2.4.3. Adattag objektumok
III.2.2.5. Osztálytagokra mutató pointerek
III.2.3. Operátorok túlterhelése (operator overloading)
III.2.3.1. Operátorfüggvények készítése
III.2.3.2. Típus-átalakító operátorfüggvények használata
III.2.3.3. Az osztályok bővítése input/output műveletekkel
III.3. Öröklés (származtatás)
III.3.1. Osztályok származtatása
III.3.2. Az alaposztály(ok) inicializálása
III.3.3. Az osztálytagok elérése öröklés esetén
III.3.3.1. Az öröklött tagok elérése
III.3.3.2. A friend viszony az öröklés során
III.3.4. Virtuális alaposztályok a többszörös öröklésnél
III.3.5. Öröklés és/vagy kompozíció?
III.3.5.1. Újrahasznosítás kompozícióval
III.3.5.2. Újrahasznosítás nyilvános örökléssel
III.4. Polimorfizmus (többalakúság)
III.4.1. Virtuális tagfüggvények
III.4.2. A virtuális függvények felüldefiniálása (redefine)
III.4.3. A korai és a késői kötés
III.4.3.1. A statikus korai kötés
III.4.3.2. A dinamikus késői kötés
III.4.3.3. A virtuális metódustábla
III.4.4. Virtuális destruktorok
III.4.5. Absztrakt osztályok és interfészek
III.4.6. Futás közbeni típusinformációk osztályok esetén
III.5. Osztálysablonok (class templates)
III.5.1. Osztálysablon lépésről-lépésre
III.5.2. Általánosított osztály definiálása
III.5.3. Példányosítás és specializáció
III.5.4. Érték- és alapértelmezett sablonparaméterek
III.5.5. Az osztálysablon „barátai” és statikus adattagjai
III.5.6. A C++ nyelv szabványos sablonkönyvtára (STL)
III.5.6.1. Az STL felépítése
III.5.6.2. Az STL és C++ tömbök
III.5.6.3. Az STL tárolók használata
III.5.6.4. Az STL tároló adaptációk alkalmazása
IV. A Microsoft Windows programozása C++ nyelven
IV.1. A CLI specialitásai, a szabványos C++ és a C++/CLI
IV.1.1. A nativ kód fordítási és futtatási folyamata Windows alatt
IV.1.2. Problémák a natív kódú programok fejlesztése és használata során.
IV.1.3. Platformfüggetlenség
IV.1.4. Az MSIL kód futtatása
IV.1.5. Integrált fejlesztő környezet
IV.1.6. A vezérlők, vizuális programozás
IV.1.7. A .NET keretrendszer
IV.1.8. C#
IV.1.9. A C++ bővitése a CLI-hez
IV.1.10. A C++/CLI bővitett adattípusai
IV.1.11. Az előredefiniált referencia osztály: String
IV.1.12. A System::Convert statikus osztály
IV.1.13. A CLI array template-tel megvalósitott tömb referencia osztálya
IV.1.14. C++/CLI: Gyakorlati megvalósitás pl. a Visual Studio 2008-as változatban
IV.1.15. Az Intellisense beépitett segítség
IV.1.16. A CLR-es program típusának beállitása.
IV.2. Az ablakmodell és az alapvezérlők.
IV.2.1. A Form alapvezérlő
IV.2.2. A Form vezérlő gyakran használt tulajdonságai
IV.2.3. A Form vezérlő eseményei
IV.2.4. A vezérlők állapotának aktualizálása
IV.2.5. Alapvezérlők: Label (címke) vezérlő
IV.2.6. Alapvezérlők: TextBox (szövegmező) vezérlő
IV.2.7. Alapvezérlők: a Button (nyomógomb) vezérlő
IV.2.8. Logikai értékekhez használható vezérlők: a CheckBox (jelölő négyzet)
IV.2.9. Logikai értékekhez használható vezérlők: a RadioButton (opciós gomb)
IV.2.10. Konténerobjektum vezérlő: a GroupBox (csoport mező)
IV.2.11. Diszkrét értékeket bevivő vezérlők: a HscrollBar (vízszintes csúszka) és a VscrollBar (függőleges csúszka)
IV.2.12. Egész szám beviteli vezérlője: NumericUpDown
IV.2.13. Több objektumból választásra képes vezérlők: ListBox és a ComboBox
IV.2.14. Feldolgozás állapotát mutató vezérlő: ProgressBar
IV.2.15. Pixelgrafikus képeket megjeleníteni képes vezérlő: a PictureBox (képmező)
IV.2.16. Az ablakunk felső részén lévő menüsor: a MenuStrip (menüsor) vezérlő
IV.2.17. Az alaphelyzetben nem látható ContextMenuStrip vezérlő
IV.2.18. Az eszközkészlet menüsora: a ToolStrip vezérlő
IV.2.19. Az ablak alsó sorában megjelenő állapotsor, a StatusStrip vezérlő
IV.2.20. A fileok használatában segítő dialógusablakok: OpenFileDialog, SaveFileDialog és FolderBrowserDialog
IV.2.21. Az előre definiált üzenetablak: MessageBox
IV.2.22. Az időzítésre használt vezérlő: Timer
IV.2.23. A SerialPort
IV.3. Szöveges, bináris állományok, adatfolyamok.
IV.3.1. Előkészületek a fájlkezeléshez
IV.3.2. A statikus File osztály metódusai
IV.3.3. A FileStream referencia osztály
IV.3.4. A BinaryReader referencia osztály
IV.3.5. A BinaryWriter referencia osztály
IV.3.6. Szövegfájlok kezelése: StreamReader és StreamWriter referencia osztályok
IV.3.7. A MemoryStream referencia osztály
IV.4. A GDI+
IV.4.1. A GDI+használata
IV.4.2. A GDI rajzolási lehetőségei
IV.4.3. A Graphics osztály
IV.4.4. Koordináta-rendszerek
IV.4.5. Koordináta-transzformáció
IV.4.6. A GDI+ színkezelése (Color)
IV.4.7. Geometriai adatok (Point, Size, Rectangle, GraphicsPath)
IV.4.7.1. Méretek tárolása
IV.4.7.2. Síkbeli pontok tárolása
IV.4.7.3. Síkbeli téglalapok tárolása
IV.4.7.4. Geometriai alakzatok
IV.4.8. Régiók
IV.4.9. Képek kezelése (Image, Bitmap, MetaFile, Icon)
IV.4.10. Ecsetek
IV.4.11. Tollak
IV.4.12. Font, FontFamily
IV.4.13. Rajzrutinok
IV.4.14. Nyomtatás
Irodalmak:
V. Nyílt forráskódú rendszerek fejlesztése
V.1. A Linux rendszer felépítése
V.1.1. A Unix története
V.1.2. Az Open Source programkészítési modell
V.1.3. A Linux operációs rendszer
V.1.4. Linux disztribúciók
V.1.5. X Window System
V.1.6. A beágyazott Linux
V.2. A GCC fordító
V.2.1. A GCC keletkezése
V.2.2. A forditás lépései GCC-vel
V.2.3. Host és Target
V.2.4. A GCC gyakran használt opciói
V.2.5. A make segédprogram
V.2.6. A gdb debugger (hibakereső/nyomkövető)
V.3. Posix C, C++ rendszerkönyvtárak
V.3.1. stdio.h
V.3.2. math.h
V.3.3. stdlib.h
V.3.4. time.h
V.3.5. stdarg.h
V.3.6. string.h
V.3.7. dirent.h
V.3.8. sys/stat.h
V.3.9. unistd.h
VI. Célspecifikus alkalmazások
VI.1. SOC (System On a Chip)
VI.1.1. A SOC definíciója
VI.1.2. A SOC részei
VI.2. Beágyazott eszközök, PC-s fejlesztő rendszerek
VI.2.1. Atmel: WinAVR és AVR studio
VI.2.2. Microchip: MPLAB IDE és MPLAB-X
VI.3. Elosztott rendszerek programozása
VI.3.1. CORBA
VI.3.2. A CORBA nyílt forráskódú implementációi
VI.3.3. ICE – internet communication engine
A. Függelék – Szabványos C++ összefoglaló táblázatok
A.1. Az ASCII kódtábla
A.2. C++ nyelv foglalt szavai
A.3. Escape karakterek
A.4. C++ adattípusok és értékkészletük
A.5. A C++ nyelv utasításai
A.6. C++ előfeldolgozó (perprocesszor) utasítások
A.7. C++ műveletek elsőbbsége és csoportosítása
A.8. Néhány gyakran használt matematikai függvény
A.9. C++ tárolási osztályok
A.10. Input/Output (I/O) manipulátorok
A.11. A szabványos C++ nyelv deklarációs állományai
B. Függelék – C++/CLI összefoglaló táblázatok
B.1. A C++/CLI foglalt szavai
B.2. A C++/CLI osztály és struktúra típusai
B.3. Mutató és hivatkozás műveletek a C++/CLI-ben
B.4. A .NET és a C++/CLI egyszerű típusok
Az ábrák listája
I.1. A projektválasztás
I.2. A projekt beállításai
I.3. A lehetséges forrásfájlok
I.4. A futó program ablaka
I.5. A C++ program fordításának lépései
I.6. C++ adattípusok csoportosítása
I.7. Az egyszerű if utasítás működése
I.8. Az if-else szerkezet logikai vázlata
I.9. A többirányú elágazás logikai vázlata
I.10. A while ciklus működésének logikai vázlata
I.11. A for ciklus működésének logikai vázlata
I.12. A do-while ciklus működési logikája
I.13. C++ program memóriahasználat
I.14. Dinamikus memóriafoglalás
I.15. Egydimenziós tömb grafikus ábrázolása
I.16. Kétdimenziós tömb grafikus ábrázolása
I.17. Mutatók és a tömbök kapcsolata
I.18. Kétdimenziós tömb a memóriában
I.19. Dinamikus foglalású sorvektorok
I.20. Dinamikus foglalású mutatóvektor és sorvektorok
I.21. Sztring konstans a memóriában
I.22. Sztringtömb kétdimenziós tömbben tárolva
I.23. Optimális tárolású sztringtömb
I.24. Struktúra a memóriában
I.25. A CDTar program adatfeldolgozása
I.26. Egyszeresen láncolt lista
I.27. Unió a memóriában
I.28. A datum struktúra a memóriában
II.1. Függvény-definíció
II.2. A függvényhívás menete
II.3. A harmadfokú polinom grafikonja
II.4. Az argv paraméter értelmezése
II.5. Parancssor argumentumok megadása
II.6. Háromszög területének számítása
II.7. A változók hatókörei
II.8. A C++ fordítás folyamata
III.1. Az énAutóm objektum (a Teherautó osztály példánya)
III.2. Az öröklés menete
III.3. Többszörös öröklés
III.4. Az Alkalmazott osztály és az objektumai
III.5. A C++ többszörös örölésű I/O osztályai
III.6. Geometriai osztályok hierarchiája
III.7. Virtuális alaposztályok alkalmazása
III.8. Korai kötés példa
III.9. Késői kötés példa
III.10. A példaprogram virtuális metódustáblái
IV.1. Memória takarítás előtt
IV.2. Memória takarítás után
IV.3. Projekttípus
IV.4. A projekt
IV.5. Az ablakmodell
IV.6. A kódablak
IV.7. A szerszámos láda
IV.8. A vezérlő menüje
IV.9. A vezérlő tulajdonságai
IV.10. A vezérlő eseményei
IV.11. A vezérlő Click eseménye
IV.12. A beépített segítség
IV.13. A projekt adatai
IV.14. A program típusa
IV.15. A program ablakának részlete
IV.16. A program ablaka
IV.17. A program ablaka
IV.18. Az átméretezett ablak
IV.19. A Bitmap középen
IV.20. A zoomolt Bitmap
IV.21. A menü
IV.22. A menü definíció
IV.23. A Súgó menü
IV.24. Almenük
IV.25. Kontextus menü
IV.26. Menülem készlet
IV.27. A MessageBox gombjainak beállítása
IV.28. A MessageBox
IV.29. A fájlkezelés modellje
IV.30. A GDI+ osztályai
IV.31. A rajzolt vonal minden átméretezés után automatikusan megjelenik
IV.32. Ha nem a Paint-ben rajzolunk, minimalizálás utáni nagyításkor eltűnik a kék vonal
IV.33. Az általános axonometria
IV.34. Az izometrikus axonometria
IV.35. A katonai axonometria
IV.36. A 2D-s koordinátarendszer
IV.37. Kocka axonometriában
IV.38. Centrális vetítés
IV.39. A kocka perspektív nézetei
IV.40. A torzítás megadása
IV.41. A torzítás
IV.42. Eltolás nyújtás mátrix-szal
IV.43. Eltolás és forgatás
IV.44. Eltolás és nyírás
IV.45. A mm skála és a PageScale tulajdonság
IV.46. Színkeverő
IV.47. Alternate és Winding görbelánc
IV.48. Ellipszisív
IV.49. A harmadfokú Bezier-görbe
IV.50. A harmadfokú Bezier-görbék folytonosan illesztve
IV.51. A kardinális spline
IV.52. Catmull-Rom spline
IV.53. Szövegek a figurában
IV.54. Két összefűzött figura összekötve és nem összekötve
IV.55. Szélesített figura
IV.56. Torzított figura
IV.57. Körbevágott figura
IV.58. Vektoros A
IV.59. Raszteres A
IV.60. Image a formon
IV.61. Halftone ábrázolás
IV.62. Elforgatott kép
IV.63. Bitkép színezés
IV.64. Nem menedzselt bitkép kezelés
IV.65. Ecsetek
IV.66. Tollak
IV.67. Karakterjellemzők
IV.68. Hagyományos karakter szélességek
IV.69. ABC karakterszélességek
IV.70. Fontcsaládok
IV.71. Font torzítások
IV.72. Nagyított és nagyított torzított kép
IV.73. Az OnNote az alapértelmezett nyomtató
VI.1. A PIC32MX blokkdiagramja
VI.2. RealTek SOC csatlakoztatási lehetőségei
VI.3. A mintaprogram
VI.4. Az MPLAB IDE
VI.5. CORBA beépítés
VI.6. Az ICE programok szerkezete
VI.7. Az ICE könyvtárak