A Symbianban a C++ alaptípusok helyett azok Symbianos megfelelői használatosak. Ezek az elnevezési szokásokhoz illeszkedően T betűvel kezdődnek, és egy részük csak egy typedef az eredeti C++ típusra, egy részük viszont „igazi” T osztály.
Ezekre a típusokra azért is volt szükség, mert a C++ nem határozza meg, hogy egy adott típus (például int) fizikailag hogyan (hány bit hosszon) tárolódik. Az egyes típusoknak a Symbianban van olyan változata is, amely konkrét bithosszúságú.
Nézzük meg tehát a különböző alaptípusokat:
• TInt
Egy gépi szú hosszúságú előjeles egész, aritmetikai műveletekben használatos.
• TInt8, TInt16, TInt32
Adott hosszúságú előjeles egész. Akkor használjuk, ha a konkrét fizikai méret is fontos.
• TUint
Egy gépi szó hosszúságú előjel nélküli egész. Használata nem olyan aritmetikai műveletek során javasolt, ahol az adott változó csak pozitív értékei vehet fel, hanem olyan műveletekhez, ahol az előjel hatása zavaró, mint például a különféle bitműveleteknél.
• TUinit8, TUint16, TUint32
Előjel nélküli adott bithosszúságú egész.
• TText
Egy karaktert jelképező típus, melynek hossza Unicode-ot használó programok esetén 16 bit, egyébként pedig 8 bit. Manapság szinte mindig Unicode-ot használni képes kódot fordítunk.
• TText8, TText16
Fordítási paraméterektől független, adott bithosszúságú karaktertípus.
• TChar
Ez az osztály karakterek manipulálására (például nagybetűvé alakítás) és vizsgálataira (például vezérlő karakter-e) készült segítő osztály.
• TBool
Ez a C++ bool típusának felel meg, értéke ETrue (igaz) vagy EFalse (hamis) lehet, az érték egy gépi szó hosszúságon van tárolva.
• TReal
64 bites dupla pontosságú valós szám, általában matematikai műveletekhez. Mivel a Symbian operációs rendszer a legtöbb esetben olyan RISC processzorokon fut, amelyek nem támogatnak lebegőpontos számításokat, ezért ha tehetjük, kerüljük a használatukat, mert erős teljesítménycsökkenést tapasztalhatunk.
• TReal32, TReal64
Megadott pontosságú lebegőpontos szám.
• TRefByValue
A változó paraméterű függvények egyéb paramétereinek referencia szerinti átadását hivatott megoldani ez a template.
• Min(), Max(), Abs(), Rng()
Inline template függvények, melyek visszaadják két érték közül a kisebbet vagy a nagyobbat, kiszámítják az abszolút értékeit, vagy egy érték két másik érték közé esését vizsgálják.
Mivel Symbianban nincs STL, és a C nyelvből ismert sztringkezelés nem támogatja az erőforrások biztonságos kezelését, ezért a Symbian saját maga definiált osztályokat a szöveges adatok kezelésére. Ezek az ún. Deszkriptorok, amelyek jól illeszkednek a memóriakezeléshez is.
Alapvetően három helyen hozhatunk létre sztringeket. Definiálhatunk kódba belefordított sztringkonstansokat, vagy a stacken is elhelyezhetjük őket, de a stack korlátozott mérete miatt, itt csak rövid szövegek (pl fájlnév) elhelyezésére van lehetőségünk. A futásiidőben manipulálandó, nagyméretű sztringeket, pedig mindig a heapen hozunk létre.
Symbianban minden deszkriptorosztály a TDesC absztrakt ősosztályból származik. Az osztálynév végi ’C’ karakter a Konstans kifejezésre utal. És itt el is érkeztünk egy példához, a Symbian következetlenségeire, ugyanis a Symbian módosítható (nem konstans) deszkriptorosztályai szintén egy közös ősösztályból származnak, a TDes-ből, mely azonban közvetlen leszármazottja a fenn említett TDesC-nek :-D (ld. ábra)
A TDesC mint minden deszkriptorok atyja hordozza minden deszkriptor szerkezeti felépítésének alapjait. Ez alapján az objektumok első 4 bájtján mindig a hossz kerül eltárolásra, annak a szöveges, vagy bináris adatnak a bájtokban meghatározott hossza, amit a deszkriptor éppen tartalmaz. Valójában ennek a 32 bitnek csak az alsó 28 bitje szolgál a hossz eltárolására, a felső 4 bit pedig a deszkriptor típusát határozza meg. Tehát egy deszkriptor által tárolt adatok maximális hossza 2^28 bájt (256 MB) lehet, ami mobileszközök esetén elég kell, legyen.
A módosítható deszkriptorok esetén a következő 4 bájt tárolja el a deszkriptor maximálisan megengedhető méretét, amit az objektum definiálása során kötelezően meg kell adni.
A további memóriaelrendezés kategóriánként változik.
Konstans sztringeket a _LIT és _L makrók segítségével tudunk definiálni.
A _LIT makró egy TLitC típusú objektumot állít elő, a TLitC szokatlanul nem TDesC-ből származik, de memóriabeli elrendezése azonos a TBufC-ével, ennek következtében bárhol használható TDesC helyett.
Az _L makró bárhol használható TPtrC helyett, anélkül hogy korábban deklarálnánk, ezáltal minden egyes hívása egy új objektumot hoz létre. Emiatt tehát ugyan azt a konstans szöveget használva is újabb és újabb memóriaterületek kerülnek lefoglalásra, így a memóriahasználata nem hatékony. Ezért is ajánlják kerülését, és helyette inkább a _LIT makró használatát.
Számos függvény található a deszkriptorosztáylokban, melyek segítik a munkánkat.
Ptr | A tárolt adat címének az elérése. | |
Length | A tárolt karakterek száma. | |
Size | Az adat méretét adja vissza bájtban. (Tehát Unicode támogatás esetén a hossz kétszeresét.) | |
MaxLength | A maximális hosszt adja vissza. (Csak TDes-nél.) | |
Locate, Find | A sztringben való előre- és hátrafelé keresést támogatják. | |
Left, Right, Mid | A sztring egyes részeit érhetjük el. | |
Compare, CompareC, CompareF | A sztringek összehasonlítását szolgálják. Compare: bájtonként. CompareC: nyelvtől függő rendezés szerint. CompareF: ékezetek nélkül, nagybetűssé alakítva. | |
Copy, Append, Insert | TDes esetén a Copy-val másolhatunk a deszkriptorba. Az Append-del tudunk hozzáfűzni. Az Insert segítségével pedig egy adott pozícióra tudunk beszúrni. | |
Delete, Replace | A Delete a sztring közepéből távolít el karaktereket. A Replace pedig felülírja a sztring egy részét más adattal. | |
Fold, LowerCase, UpperCase | Karakterek manipulálását végző függvények, amelyek rendre a következőket csinálják: nagybetűssé alakítás és ékezetek eltávolítása; kisbetűssé alakítás; nagybetűssé alakítás. | |
Trim | Eltávolítja a sztring elejéről és végéről a whitespace karaktereket (szóköz, tabulátor, újsor karakter). | |
Justify | Jobbra, balra illetve középre tudja rendezni a szöveget. | |
AppendFormat | A C-beli sprintf függvényhez hasonlóan egy formátumsztringet és változó mennyiségű paramétert vár, majd a formázott részt a sztring végéhez illeszti. | |
AppendNum | Szám hozzáfűzése a sztringhez, hatékonyabb, mint az AppendFormat. |
Nézzük meg a különböző sztringosztályokat és használatukat.
•_LIT(KRomSztring,"Alma");
Konstans, kódba fordított sztringek a _LIT (literál) makróval hozhatók létre. Az eredményük egy TLitC típusú objektum lesz, ez nem leszármazottja a TDesC-nek.
•TPtrCptrSzting(KRomSztring);
Az előbbi konstansra kaphatunk egy mutatót, ez már TPtrC leszármazottja.
•const TDesC& oldLitSzting = _L("Alma");
A literálok régi formája, ekkor nem tárolódik a sztring hossza. Ez viszont a TDesC-ből származik. Hatékonysági okokból célszerű a _LIT-et használni.
•TBufC<4> stackSztring(KRomSztring);
A stackSzting változónk a stacken jön létre, és a konstans KRomSzting értéke belemásolódik.
•HBufC* heapSzting = KRomSztring.AllocLC();
Létrehoztahunk sztringet a heap-en is, ahogy már említettük. Itt TDesC típusúvá konvertáljuk, majd annak AllocLC() műveletével foglalunk helyet a heap-en.
•TDesC8, TDes8, TBuf8, TPtr8, HBuf8,...
Ezek 8 bites karakterek tárolására szánt osztályok, akkor használjuk, ha bináris adatokkal dolgozunk, és nem Unicode kódolást alkalmazunk.