Tartalmi kivonat
Tartalomjegyzek 1. C programozas a BORLAND C++-ban 1.1 Alapismeretek 1.2 A valtozok alaptpusai 1.21 A karakter tpus es a sztringek 1.22 Az egesz tpusok 1.23 A felsorolt tpus 1.24 Amit a logikai tpusrol tudni kell a C-ben 1.25 A lebeg}opontos valos szamok tpusai 1.26 A mutato tpusok 1.3 Az el}ofeldolgozo 1.31 Szimbolumok es makrok 1.32 Felteteles fordtas 1.33 El}oredenialt szimbolumok 1.34 File-beeptes 1.35 Implementacio-fugg}o vezerl}osorok 1.4 Tarolasi osztalyok, hataskorok 1.41 Modulok, blokkok 1.42 Fuggvenyek tarolasi osztalyai 1.43 Valtozok elettartama es hataskore 1.44
Egyszer}u adatdeklaratorok 1.45 Fuggvenyek dencioja es deklaracioja 1.46 Modosto jelz}ok 1.47 Tpusdenialo (typedef) azonostok 1.5 Kifejezesek 1.51 Els}odleges kifejezesek 1.52 Operatorok 1.6 Konverziok 1.61 A konverzio a char, az int es az enum tpusok kozott 1.62 Konverzio mutatok kozott 1.63 Aritmetikai konverziok 1.7 Utastasok 1.71 Kifejezes-utastasok 1.72 A felteteles utastas 1.73 Ciklusszervez}o utastasok 1.74 Egyeb vezerlesatado utastasok 1.8 Strukturak es unionok 1.81 Strukturak megadasa 1.82 Hivatkozas struktura elemekre i 1 2 3 4 5 6 6 7 7 9
9 12 13 14 15 16 16 16 16 18 20 23 25 27 27 28 34 34 35 35 35 36 37 38 40 42 42 44 TARTALOMJEGYZE K ii 1.83 A bitmez}ok 1.84 A union fogalma 1.9 Mutatok es tombok 1.91 A mutatok hasznalata 1.92 E rtekadas mutatoknak 1.93 Mutatok fuggvenyparameterkent 1.94 Pointer aritmetika 1.95 Tombok hasznalata Tobbdimenzios tombok 1.96 Kapcsolat tombok es mutatok kozott 1.97 A ltalanos mutatok 1.98 Fuggvenyekre mutato pointerek 1.10 Bevitel es kivitel 1.101 Alacsony szint}u I/O 1.102 Folyam jelleg}u I/O 1.11 A main fuggveny 1.12 Tovabbi magyarazatok 1.121 A balertek es jobbertek fogalma 1.122 Meg egyszer a
deklaraciokrol es a tpusokrol 1.123 Fuggvenyek valtozo szamu parameterrel 1.13 Osszetett mintapelda . 1.131 A tervezes egyes fazisai 1.132 A menukezel}o rendszer listaja 2. Programozas C++-ban 44 45 46 47 49 50 51 53 54 56 57 57 58 58 64 65 65 66 67 68 69 75 93 2.1 U j elemek a C++-ban 94 2.11 Alternatvak a #define direktva helyett 94 2.12 Cm szerint nyilvantartott tpusu, vagy referencia tpusu valtozok . 95 2.13 Inicializalt fuggvenyparameterek 98 2.14 C ++ kommentek 99 2.2 Az OOP alapjai 99 2.3 Egysegbezaras 100 okles . 101 2.4 Or 2.5 Tobbret}useg (polimorzmus) 104 2.6 Fuggvenymez}ok denialasa 106 2.61 Fuggvenymez}ok
aktivizalasa 108 2.62 A this nev}u, implicit mutato 108 2.7 Konstruktorok es destruktorok 109 2.71 Konstruktorok denialasa 110 2.72 Destruktorok denialasa 111 2.8 Mez}ohozzaferes 112 2.81 Mez}ohozzaferesi szintek 113 2.82 Mez}ohozzaferes es orokles 114 2.9 Virtualis fuggvenyek 115 2.91 Kes}oi osszerendeles 115 2.92 Virtualis fuggvenyek deklaralasa 118 2.10 Dinamikus objektumok 119 2.101 Dinamikus objektumok letrehozasa 119 2.102 Dinamikus objektumok megszuntetese 120 2.11 Tovabbi exibilitas a C++-ban 120 iii 2.111 Rokonok es baratok 120 2.112 Operator overloading 122 2.12 C++ I/O konyvtarak 122
A. Include le-ok es fuggvenyek 125 Irodalomjegyzek 197 A.1 Fontosabb konyvtari fuggvenyek 125 A.11 Fuggvenyek szoveges uzemmodban 125 A.12 Hangeektusok letrehozasa 131 A.13 Fuggvenyek grakus uzemmodban 132 A.14 A ltalanos konyvtari fuggvenyek 157 1. fejezet C programozas a BORLAND C++-ban A BORLAND C++ rendszer az ANSI szabvanyajanlasnak megfelel}o, korszer}u, sok hasznos szolgaltatast nyujto C nyelvi implementacio. Ismertetesunk soran igyekeztunk kerulni a nyelv formalis denciojat, inkabb szavakba ontve, peldakon keresztul probaltuk azt bemutatni. A nyelv bemutatasat az ANSI C, illetve annak a BORLAND C++-beli implementaciojanak ismertetesevel kezdjuk. A 2. fejezet foglalkozik a nyelv objektum-orientalt vonasainak a targyalasaval A BORLAND C++ rendszer konyvtari fuggvenyeinek rovid lerasat az A.1 fuggelek tartalmazza
Konyvunk masodik kotete azzal foglalkozik, milyen modon hasznalhato a BORLAND C++ rendszer MS-Windows alkalmazoi programok fejlesztesere. Ha az Olvaso az egyes C nyelvi elemek precz lerasa irant erdekl}odik, akkor a legels}o es legfontosabb C nyelvi referenciat, B. W Kernighan es D M Ritchie konyvenek 1]. A fuggeleket ajanljuk tanulmanyozasra A nyelv BORLAND C++ implementacoval kapcsolatos reszleteit az eredeti programdokumentacio vonatkozo kotetei 2], 3] tartalmazzak. Kulon erenye a programdokumentacio ezen koteteinek, hogy kiternek a portabilitasi kerdesekre is. Megadunk itt egy egyszer}u kis peldaprogramot, amelyre kes}obb tobbszor is hivatkozni fogunk, javasolva, hogy az Olvaso lepjen be a a BORLAND C++ integralt fejleszt}oi kornyezetebe es gepelje be a programot, majd fordtsa le es probalja is ki. A program funkcioja, hogy ENTER-rel lezart sorokat ker be a felhasznalotol, es azokat ugy rja vissza a
keperny}ore, hogy a kisbet}uket a nagybet}us parjukkal, a nagybet}uket pedig a megfelel}o kisbet}uvel helyettesti. A programbol kilepni CTRL-Z billenty}uleutest tartalmazo sor berasaval lehet. Meg kell jegyeznunk, hogy nyomdatechnikai okokbol a szovegben talalhato programlistak magyar nyelv}u megjegyezseib}ol hianyoznak az ekezetek. Ezert a kellemetlensegert az Olvaso elnezeset kerjuk. /* * File: pelda.c * * Tartalom: Kisbetu-nagybetu felcserelo mintaprogram * */ #include <stdio.h> #include <ctype.h> 1 A BORLAND C++-BAN 1. FEJEZET C PROGRAMOZAS 2 /* A modulban definialt fuggvenyek: */ void main(void) /* ======================================================== / void main() { register c while ((c = getchar()) != EOF) { /* c-be olvasunk, file vegeig */ if (isupper(c)) /* Ha nagybetu, akkor. */ { c = tolower(c) /* . kisbeture csereljuk, */ } else /* . egyebkent pedig */ { c = toupper(c) /* . nagybeture csereljuk */ } /* . Az
'if' utasitas vege */ putchar(c) /* A megvaltoztatott c-t kiirjuk / } /* . A 'while' ciklus vege */ } /* . A 'main' blokk vege */ 1.1 Alapismeretek A C programutastasokat kotetlen formatumban rhatjuk. Ez azt jelenti, hogy { az el}ofeldolgozonak szolo utastasokat kiveve, lasd ott { a C nyelv sorfuggetlen, azaz egy sorba tobb utastas is rhato, illetve egy utastas tobb sorba is torhet}o. A ltalanos erveny}u szabaly, hogy ahol egy szokoz allhat, ott tetsz}oleges szamu { legalabb egy { tetsz}oleges szokozjelleg}u karakter (un. whitespace) is allhat. Szokozjelleg}u karakter a szokoz, a tabulator es az ujsor karakter, illetve ilyen funkcioju a megjegyzes (comment) is. A megjegyzesek /* karakterkombinacioval kezd}od}o es / kombinacioval lezart, tetszes szerinti karaktersorozatok. Ennek alapjan a pelda.c forrasprogram alabbi ket sorat void main() { a kovetkez}o formaban is rhattuk volna:
main() void { /* komment / Modulnak nevezunk egy onalloan fordthato forrasnyelvi egyseget. Az operacios rendszer szintjen a modul onallo le-kent jelentkezik A C forrasmodulokat hagyomanyosan .c kiterjesztes}u le-okban helyezzuk el, kiveve az un include le-okat (header les, illetve fejlecle-ok), amelyek h kiterjesztest kapnak A C programok egy, vagy tobb modulbol epulnek fel, a pelda.c egymodulos program Ha egy tobbmodulos programban csak az egyik modulhoz tartozo forrasle-t modostjuk, akkor elegend}o csupan azt ujrafordtani, majd a tobbi modullal { es a megfelel}o modulkonyvtarakkal { ujraszerkeszteni. A kulonallo modulok forrasnyelvi szinten deklaraciokon keresztul tartjak egymassal a kapcsolatot, amelyeket celszer}uen include le-okba foglalunk. ALAPTIPUSAI 1.2 A VALTOZ OK 3 A modulok fordtasvezerl}o utastasokbol, valtozo- es fuggveny-deklaraciokbol/denciokbol allnak. Az egyes tarolasi
egysegek lehetnek kodgeneralok (ezekbe helyezzuk a vegrehajthato utastasokat), es lehetnek tarterulet foglalok (adatok, valtozok) A kodgeneralo tarolasi egysegeket a C nyelvben altalanosan fuggvenyeknek nevezzuk (szemben mas programozasi nyelvekkel, ahol kulonbseget tesznek a function es a procedure, illetve subroutine kozott). Egy tarolasi egyseg deklaracioja kozli a fordtoprogrammal az adott egyseg jellemz}oit, de nem jar egyutt tarterulet foglalassal, az mashol (esetleg mas modulban) tortenik meg. A deklaraciot kovet}oen az adott tarolasi egyseget a fordto az adott tulajdonsagokkal rendelkez}o, letez}o egysegnek tetelezi fel (ha egy deklaraciohoz sehol sem tartozik megfelel}o dencio, akkor a szerkesztes alkalmaval hibauzenetet kapunk). Ugyanazt a tarolasi egyseget tobbszor is deklaralhatjuk egy forrasallomanyban mindaddig, amg az egymast kovet}o deklaraciok osszhangban vannak egymassal. Egy
tarolasi egyseg denciojakor tortenik meg az adott egyseg tenyleges elhelyezese Tarterulet-foglalo tarolasi egyseg eseten lefoglalasra kerul a szukseges adatterulet, mg kodgeneralo egyseg eseten az adott utastasokat fordtja le es helyezi el a fordto program. (Itt adjuk meg a programunk vegrehajthato utastasait). Egy dencio ertelemszer}uen deklaracio ertek}u is, kiveve a kodgeneralo-egysegek (fuggvenyek) dencioit, melyeket nem tekint teljes ertek}u deklaracionak a C fordto. Ezert celszer}u minden forrasmodul elejen elhelyezni az adott modulban denialando fuggvenyek teljes deklaraciojat (void main(void) sor a pelda.c-ben), ez egyben j ol felhasznalhato dokumentalasra is. Ugyanannak a tarolasi egysegnek termeszetesen { a programhoz tartozo osszes modult gyelembe veve { kizarolag egy helyen lehet dencioja (ezert "illetlenseg" include le-ba denciot helyezni). A
felhasznalo azonostas celjabol a tarolasi egysegekhez azonostokat (identier) rendel. A C-ben az azonosto bet}uvel kezd}od}o, bet}uvel es/vagy szamjeggyel folytatodo karaktersorozat. A kis- es nagybet}uk kulonboz}onek szamtanak (alfa, AlfA) Bet} unek tekintjuk az angol ABC bet}uin (a{z, A{Z) kvul az alahuzas karaktert (' ') is, szamjegyek a szokasos 0{9 karakterek. Az azonostok hoszszara nincs megkotes, de a BORLAND C++ fordto csak az els}o 32 karaktert veszi gyelembe (mas ertek is beallthato az Options menuben). Javasoljuk, hogy a tarolasi egysegek elnevezesere hasznaljunk csupa kisbet}ut tartalmazo azonostokat, es ne kezdjuk sajat azonostoinkat alahuzas karakterrel. 1.2 A valtozok alaptpusai Ebben a reszben a tarterulet foglalo tarolasi egysegekkel foglalkozunk reszletesebben. A tovabbiakban az azonostoval ellatott tarterulet foglalo egysegeket roviden valtozoknak nevezzuk. A
valtozok tpusa meghatarozza az elfoglalt tarterulet nagysagat, az operatorokhoz tartozo gepi utastas(sorozat)okat, stb. A BORLAND C++ a kovetkez}o, tovabb mar nem bonthato, elemi tpusokkal rendelkezik: karakter, egeszek (tobbfele meret es abr azolasmod), lebeg} opontos (tobbfele pontossag), mutato (pointer). A BORLAND C++-BAN 1. FEJEZET C PROGRAMOZAS 4 C-beli jeloles 'na' 'nb' 'nf' 'nn' 'nr' 'nt' 'nv' 'nn' 'n'' 'n"' 'n?' 'nooo' 'nxhhh' Karakter Magyarazat (BEL) (BS) (FF) (LF) (CR) (HT) (VT) (n) (') (") (?) cseng}o karakter visszaleptetes lapdobas ujsor (soremeles) kocsi vissza vzszintes tabulator (vagy maskeppen: TAB) fugg}oleges tabulator maga a backslash karakter egyszeres idez}ojel (apostrophe) dupla idez}ojel kerd}ojel a ooo oktalis kodu katkter a hhh
hexadecimalis kodu karakter 1.1 tablazat Backslash-szekvenciakkal megadhato karakterek Ezeket az alaptpusokat azutan { a kes}obbiekben lert modokon { ept}okovekkent felhasznalhatjuk un. szarmaztatott tpusok kepzesehez, illetve bonyolultabb aggregatumok (tombok, strukturak, unionok, stb) feleptesehez A kulonfele egeszeket es a karaktertpust osszefoglalo neven sorszamozott tpusnak nevezzuk. (A sorszamozott tpus osszefoglalo elnevezest a magyar nyelv}u C szakirodalom (peldaul 1]), integralis tpusnak (integral type) nevezi. A fogalmi hasonlosag, es a magyarosabb hangzas miatt megtartottuk a Pascal nyelvvel kapcsolatban altalanosan hasznalt terminologiat, a sorszamozott tpus elnevezest) 1.21 A karakter tpus es a sztringek A karakter tpusu valtozo egy karakter tarolasara alkalmas. A BORLAND C++ fordto { az MS-DOS operacios rendszerrel osszhangban { a karaktereket az ASCII tabla szerint kodolja.
A karakterallandok megadasa egyszeres idez}ojelek kozott tortenik, peldaul 'A', '(', stb. Lehet}oseg van bizonyos nem lathato karakterek abrazolasara a backslash karakter segtsegevel. Ezeket a 11 tablazatban foglatuk ossze. A karakterlancok (sztringek) a C nyelvben nem alaptpusok, hanem karaktertombokben abrazoljuk }oket. Mivel egy sztring hossza dinamikusan valtozhat, ezert a lefoglalt tarteruletb}ol adott pillanatban csak bizonyos karakterek tartoznak tenylegesen a karakterlanchoz. A problemat ugy oldottak fel, hogy a karakterkeszlet egyik elemet kijeloltek arra a specialis funkciora, hogy a sztringek veget jelezze, ily modon tehat ez a karakter maganak a sztringnek soha sem lehet resze. Ez a specialis karakter a 'n0', azaz a 0 kodu karakter, amit a tovabbikban az EOS szimbolikus neven (End Of String) fogunk hvni. A sztringallandokat a fordtonak dupla idez}ojelek kozott lehet megadni,
peldaul "Hello". Ezt a fordt o ugy ertelmezi, hogy le kell foglalni 5+1 karakternyi (6 byte) helyet a memoriaban, es a kovetkez}o karakterekkel, mint kezd}oertekkel kell feltolteni: 'H', 'e', 'l', 'l', 'o', EOS. A sztringben lehetnek backslash-t ALAPTIPUSAI 1.2 A VALTOZ OK 5 alkalmazo szekvenciak is, peldaul "Ez egy idezojel: n"nn" ami a memoriaba a kovetkez}okeppen kerul: 'E', 'z', ' ', 'e', 'g', 'y', ' ','i', 'd', 'e', 'z', 'o', 'j', 'e', 'l', ':', ' ', '"', LF, EOS. A sztringkonstansok nem nyulhatnak at a kovetkez}o sorba, de lehet }oket egymas utan valo rassal egyesteni (konkatenalni), peldaul: | "Ez egy 2 sorba irt " "sztringkonstans" 1.22 Az egesz
tpusok Az egesz tpusu valtozok meret es ertelmezes szerint tobbfelek lehetnek. Meret szerint a BORLAND C++ megkulonboztet rovid (short int) es hosszu (long int) eg eszeket, az el}obbieket 16, az utobbiakat 32 biten abrazolja. Ha nem specikaljuk az egesz tpusu valtozo meretet, hanem csak int-et adunk meg, akkor minden C fordto tobbe-kevesbe onkenyesen valasztja azt meg, a BORLAND C++ peldaul 16 bites hosszat vesz fel. Ha ki akarjuk hasznalni a C nyelvben rejl}o portabilitasi kepesseget, akkor mindig hasznaljunk explicit meretmegadast, az alabbi negy eset kivetelevel: register t arolasi osztalyu egeszeknel, f uggveny altal visszaadott egeszeknel, egesz tpus u fuggvenyparameter denciojanal, ha egy k onyvtari fuggveny meghatarozatlan meret}u egeszre mutato poin- tert var. Ezeket a fuggvenyhvasokat minden uj implementacional gondosan meg kell vizsgalni, osszevetve a gyelembe
veend}o C rendszer deklaracioival Az el}obbi kivetelek magyarazatat termeszetesen megadjuk a megfelel}o helyeken. Ezekben az esetekben azonban a programozo felel}ossege, hogy a meretmegadas nelkul felvett valtozot lgfeljebb 16 bit hosszukent kezelje (ennel kisebb hosszat int-re egyetlen komoly C fordto sem vesz fel). E rtelmezes szerint az egeszek lehetnek el}ojelesek (signed int) es el}ojel nelkuliek (unsigned int). Ha nem rjuk el}o az ertelmezest, akkor a fordto el}ojeles egeszt vesz fel. Ily modon peldaul a short int tpusu valtozok -32768 es 32767 kozott, az unsigned short int tpusuak pedig 0 es 65535 kozott vehetnek fel erteket. Itt jegyezzuk meg, hogy a char tpuson belul is letezik unsigned char, ez akkor lenyeges, ha a szabvanyos ASCII keszlett}ol elter}o erteket kvanunk benne tarolni. Ekkor a char ugy tekinthet}o, mint egy 8 bites egesz tpus, -128 es 127 illetve 0 es 255 kozotti ertekekkel. Fontos
tudnivalo, hogy a BORLAND C++ a karakteres tpussal valo barmilyen m}uveletvegzes el}ott (aritmetikai, logikai, osszehasonlto, stb. m}uvelet) azt 16 bitre terjeszti ki, gyelembe veve az ertelmezeset. Igy tehat barmilyen m}uveletvegzes szempontjabol a signed charban tarolt hexadecimalis 80 hexadecimalis FF80-kent lesz gyelembe veve, mg 6 A BORLAND C++-BAN 1. FEJEZET C PROGRAMOZAS az unsigned char-ban tarolt hexadecimalis 80 tenylegesen hexadecimalis 0080nak szamt. Tetelezzuk fel, hogy az alfa valtozo tpusa signed char, a beta valtozoe pedig unsigned char, es mindkett}obe a 128 egesz erteket rjuk. Ha alfa-t ezut an osszehasonltjuk 128-cal, akkor hamis logikai erteket kapunk, mg beta-t osszehasonltva vele, igazat! S}ot, alfa sem lesz egyenl}o beta-val. Az egesz tpusu konstansokat decimalisan, oktalisan es hexadecimalisan is megadhatjuk. Az oktalis konstansok kotelez}oen 0-val kezd}odnek, a hexadecimalisak
pedig 0x, vagy 0X el}otaggal (prex-szel) Peldaul 255 = 0377 = 0xFF A konstansokhoz is rendel meretet es ertelmezest a fordtoprogram. A szabaly az a BORLAND C++-ban, hogy a meret mindaddig 16 bit, amg ennyi bittel a megadott szam abrazolhato, azon felul 32 bites az abrazolas. Az ertelmezes decimalis konstansokra el}ojeles, a tobbire el}ojel nelkuli. Peldaul a 40000 el}ojeles egesz konstans, merete 32 bit (mert 16 biten a legnagyobb el}ojeles szam a 32767), de 0x89A0 el}ojel nelkuli 16 bites konstans. Lehet}oseg van azonban az l, illetve az L ut otaggal (sux) el}orni egy konstansra a 32 bites tarolast! az u, vagy U utotaggal pedig az el}ojel nelkuli ertelmezest. Peldaul 0L 32 bites el}ojeles, 40000U pedig 16 bites el} ojel nelkuli egesz konstans. 1.23 A felsorolt tpus Szinten egesz ertekeket hasznal az un. felsorolt (enum) tpus is Olyankor hasznaljuk, mikor nem a konkret szamertekek a fontosak, csak az, hogy ket
ertek egyenl}o-e vagy sem, illetve melyik kisebb a masiknal. Ilyenkor eleg felsorolni a hasznalni kvant egyedi azonostokat, es a fordtoprogram automatikusan ellatja }oket ertekkel. Peldaul az enum szin { piros, kek, sarga, zold } deklaracio letrehoz egy szin nev}u felsorolt tpust, amely a fenti egyedeket tartalmazza. Ha alapszin egy, a fenti tpusba tartozo valtozo, akkor van ertelme olyan ertekadasnak, mint peldaul alapszin = sarga, es lehet olyan vizsgalatokat vegezni, hogy az alapszin kek-e vagy sem, illetve nagyobb-e, mint kek (a nagysag szerinti sorrend megegyezik a felsorolasi sorrenddel, a legkisebb van legelol), azaz peldanknal maradva piros < kek < sarga < zold A felsorolt tpus a sorszamozott tpusokkal kompatibilis tpus. 1.24 Amit a logikai tpusrol tudni kell a C-ben A C nyelvben nincs explicit logikai tpus, erre a celra barmelyik sorszamozott alaptpus hasznalhato. A logikai igaz erteket az
1, a hamisat a 0 jelenti Az operatorok kozt vannak logikai jelleg}uek (peldaul az osszehasonlto operatorok), ezek mindig a fenti ket ertek valamelyiket szolgaltatjak eredmenyul. Ugyanakkor azok az operatorok, illetve utastasok, amelyek logikai jelleg}u erteket varnak (peldaul a felteteles elagaztatas), egy ennel tagabb ertelmezest hasznalnak: a 0 jelenti tovabbra is a hamis logikai erteket, azonban minden mas, nem 0 adatot igaznak fogadnak el. ALAPTIPUSAI 1.2 A VALTOZ OK 7 1.25 A lebeg}opontos valos szamok tpusai A lebeg}opontos valos szamok a BORLAND C++-ban haromfele pontossaggal allnak rendelkezesre. A float ertekek 32 biten, a double szamok 64 biten, mg a long double v altozok 80 biten tarolodnak. A pontossag mellett az abrazolhato abszolutertekek is valtoznak (lasd a 1.2 tablazatot) A lebeg}opontos konstansok megadasa a szokasos modon tortenik, a kitev}o jelzesere e es E egyarant
hasznalhato. 1.26 A mutato tpusok A mutatok (pointerek) olyan valtozok, amelyek egyes tarolasi egysegek (valtozok vagy fuggvenyek) memoria cmeit tartalmazzak. Az ilyen valtozok tehat az adott tarolasi egysegre nem kozvetlenul utalnak, hanem kozvetetten (indirekcio). A C nyelv ereje { tobbek kozott { eppen a mutatok kezeleseben es a veluk vegzett m}uveletekben rejlik (lasd kes}obb a 1.9 reszben) Ennek egyik forrasa, hogy a pointer valtozokrol nemcsak annyit tart nyilvan a fordto, hogy ez egy mutato es hogy milyen meret}u (16 vagy 32 bites), de azt is feljegyzi es koveti, hogy a kerdeses valtozo vagy kifejezes milyen tpusra mutat. Ezert valojaban a C nyelvben nincs olyan alaptpus, hogy "mutato tpus", csak olyan tpusok vannak, mint paldaul "mutato egy rovid egeszre", "mutato egy el}ojel nelkuli karakterre", vagy akar "mutato egy olyan mutatora, amelyik egy double
ertekkel visszater}o, ket el}ojel nelkuli long parametert varo fuggvenyre mutat". Azt, hogy ez igazabol nem is bonyolult, azzal bizonytjuk, hogy illusztralaskent megadunk egy denciot az utolso tpusba tartozo dfuncptrs nev}u valtozora: double (*dfuncptrs)(long, long) A fenti peldakbol az is kit}unik, hogy a pointerek tarterulet foglalo es kodgeneralo program egysegekre egyarant mutathatnak. Az el}obbieket adatpointereknek, az utobbiakat kodpointereknek nevezzuk. A mutatok a BORLAND C++ rendszerben { illeszkedve a 8086-os mikroprocesszor feleptesehez { 16, illetve 32 bit hosszuak lehetnek. A 16 bites mutatok neve near pointer, a 32 bitesek pedig tovabbi ket csoportra oszlanak, a far pointerekre es a huge pointerekre Egy near pointerrel legfeljebb 64 Kbyte tarterulet cmezhet}o meg, far es huge pointerrel a teljes 1 Mbyte-os adattar elerhet}o, de far pointerek eseteben a megcmzett tarolasi egyseg (peldaul tomb)
merete nem lehet nagyobb, mint 64 Kbyte, mg a huge pointerekre semmilyen megkotes nincs. Ennek megfelel}oen az egyes mutatokkal valo m}uveletvegzes bonyolultsaga es vegrehajtasi ideje a fentiek szerint rohamosan n}o. Azert, hogy a felhasznalo az adott feladat igenyei szerint optimalis megoldast valaszthasson, a BORLAND C++ hat un memoriamodellt bocsat a felhasznalok rendelkezesere. Ezek a kovetkez}ok: tiny model: mind az adat-, mind a kodpointerek near tpus uak. Megko- tes, hogy az osszes adatnak es programkodnak el kell ferni egy 64 Kbyte-os memoriaszegmensben. Az gy fordtott es szerkesztett programok com tpusuva alakthatok at small model: mind az adat-, mind a k odpointerek near tpusuak. Megkotes, hogy az osszes adatnak el kell ferni egy 64 Kbyte-os memoriaszegmensben, valamint az osszes programkodnak el kell ferni egy masik 64 Kbyte-os szegmensben. A BORLAND C++-BAN 1. FEJEZET C PROGRAMOZAS 8 Tpus
unsigned char enum unsigned int short int int unsigned long long float double long double near pointer far pointer Meret (bitben) 8 8 16 16 16 16 32 32 32 64 80 16 32 E rtektartomany Pontossag (decimalis jegyben) 0 . 255 ;128 . 127 ;32768 . 32767 0 . 65535 ;32768 . 32767 ;32768 . 32767 0 . 4294967295 ;2147483648 . 2147483647 3:4 10;38 . 3:4 1038 7 1:7 10;308 . 1:7 10308 15 3:4 10;4932 . 1:1 104932 19 - 1.2 tablazat Adattpusok, meretek es ertektartomanyok a BORLAND C++-ban medium model: az adatpointerek near, a kodpointerek far tpusuak. Megkotes, hogy az osszes adatnak el kell ferni egy 64 Kbyte-os memoriaszegmensben. compact model: az adatpointerek far, a kodpointerek near tpusuak. Megkotes, hogy az osszes programkodnak el kell ferni egy 64 Kbyte-os memoriaszegmensben, valamint, hogy az osszes statikus adatnak el kell ferni egy masik 64 Kbyte-os szegmensben. large model: mind az adat-, mind a k odpointerek far tpusuak.
Megkotes, hogy az osszes statikus adatnak el kell ferni egy 64 Kbyte-os memoriaszegmensben. huge model: mind az adat-, mind a k odpointerek far tpusuak. Figyeljuk meg, hogy a huge modell nem hasznal huge pointereket! A masik megjegyzesunk, hogy kodpointerben a huge tpusra soha sincs szukseg, mert egyeb megkotesek miatt egyetlen fuggveny sem lehet 64 Kbyte-nal nagyobb. Ugyanez a megkotes vonatkozik a modulokra is, azaz sem az egy modulban denialt programkod, sem az ott denialt statikus adatterulet nem haladhatja meg a 64 Kbyte-ot. A memoriamodell kivalasztasat egy program rasa soran minden modul fordtasakor celszer}u ellen}orizni. Linkeleskor az integralt rendszer automatikusan gondoskodik rola, hogy a megfelel}o modell}u indto (un startup) kod es rendszerfuggvenyek legyenek beszerkesztve. Lehet}oseg van tovabba arra is, hogy tetsz}oleges memoriamodell hasznalata eseten bizonyos mutatokat explicit modon near-nek,
far-nak, vagy huge-nak deklaraljunk, s}ot, ez az egyetlen lehet}oseg a huge pointerek hasznalatara. A mutatokkal a 19-as reszben foglakozunk reszletesen. } 1.3 AZ ELOFELDOLGOZ O C fordtoprogram forrasszoveg - el}ofeldolgozo - bels}o fordto 9 - targykod 1.1 abra Az el}ofeldolgozo kapcsolata a kornyezettel 1.3 Az el}ofeldolgozo Minden C(++) fordtoprogram szerves reszet kepezi egy un. el}ofeldolgozo (preproceszszor) A fordtoprogram es a preprocesszor kapcsolatat ugy kell elkepzelni, hogy a tulajdonkeppeni fordto nem is latja a forrasszoveget, hanem csak azt, amit ebb}ol az el}ofeldolgozo keszt a szamara. Ezt a 11 abran lathato modon kepzelhetjuk el. Jellemz}o az abran lathato egyuttm}ukodesre, hogy a bels}o fordto nem ismeri a megjegyzesek szintaxisat, ugyanis nincs ra szuksege: a neki atadott sorokbol az el}ofeldolgozo azokat "kirtja". A BORLAND C++ integralt fejeszt}oi rendszerenel a
ket resz kapcsolata olyan szoros, hogy nincs is lehet}oseg az el}ofeldolgozo kimenetenek a megtekintesere. Ehhez egy kulon segedprogramot (CPP utility) talalunk a programcsomagban. Ez szolgal arra, hogy a forrasszovegb}ol el}oalltsa az el}ofeldolgozo kimenetet egy .i kiterjesztes}u le-ba, gy lathatova teve, hogy tenylegesen mi kerul at a bels}o fordtonak. Az el}ofeldolgozo egy sororientalt szovegfeldolgozo (mas szoval makronyelv), ami semmit sem "tud" a C nyelvr}ol. Ez ket fontos kovetkezmennyel jar: az el}ofeldolgozonak szolo utastasokat nem rhatjuk olyan kotetlen formaban, mint az egyeb C utastasokat (tehat egy sorba csak egy utastas kerulhet es a parancsok nem loghatnak at masik sorba, hacsak nem jeloljuk ki folytatosornak)! masreszt minden, amit az el}ofeldolgozo m}uvel, szigoruan csak szovegmanipulacio, fuggetlenul attol, hogy C nyelvi alapszavakon, kifejezeseken vagy valtozokon dolgozik.
A preprocesszornak szolo parancsokat a sor elejen (esetleg szokozok es/vagy tabulatorok utan) allo # karakter jelzi. 1.31 Szimbolumok es makrok Az el}ofeldolgozonak szinten lehetnek "valtozoi", ezeket szimbolumoknak, illetve makroknak nevezzuk, es ugyanaz a kepzesi szabaly vonatkozik rajuk, mint mas azonostokra. Azert, hogy a preprocesszor szamara denialt szimbolumok a C forrasnyelvi szovegben elesen kulonvaljanak a programban hasznalt azonostoktol, szokas szerint a szimbolumokat csupa nagybet}uvel kepezzuk. Szimbolumokat a kovetkez}o parancssal hozhatunk letre: #define szimbolum helyettestend}o szoveg A harom f}o reszt tetsz}oleges szamu, min. 1 db szokoz es/vagy tabulator valasztja el. Az el}ofeldolgozo minden beerkez}o sort atvizsgal, tartalmaz-e korabban denialt szimbolumot. Ha igen, akkor azt lecsereli a megfelel}o helyettest}o karaktersorozatra, es ujbol atvizsgalja a sort
szimbolumokat keresve, amit uj helyettestes kovethet, stb. Mindaddig folytatodik ez a folyamat, amg vagy nem talal a sorban szimbolumot, vagy csak olyat talal, ami mar egyszer helyettestve 10 A BORLAND C++-BAN 1. FEJEZET C PROGRAMOZAS lett (a vegtelen rekurziok elkerulesere). Peldak szimbolumdenciora: | #define #define #define #define #define #define #define #define #define EOS TRUE FALSE YES bool MENUCOL MENULINE BORDER MENUROW '