Az X++ programozási nyelv

Típusok, típuskonstrukciók

Típusok, típuskonstrukciók

X + + adattípusok primitív és összetett adattípusok csoportjára oszthatóak. A programozó létrehozhat kiterjesztett adattípusokat, például az enum alaptípusra építve, vagy más primitív adattípusokat felhasználva, arra definiálva a saját típust. Minden konstansnak és változónak rendelkeznie kell típussal. Minden változónak és konstansnak definiáltnak kell lennie az első használat előtt. Metódus törzsében változó nem deklarálható. Az ilyen jellegű hiba, fordítási időben kiderül. A változókat a metódus deklarációs részében, közvetlenül a metódusnév után, de még a metódustörzs előtt kell definiálni.
Pontosvessző választja el a metódus törzsét a deklarációs résztől, melyet mindíg új sorban kell elhelyezni. X++ -ban osztály szintű tagváltozó is deklarálható, ekkor azonban az osztály classdeclaration alapértelmezett szekciójába kell elhelyezni a változó deklarációkat. Ebbe a kitüntetett részbe utasítás, értékadó utasítás, illetve egyéb nyelvi elem nem helyezhető el.Az itt deklarált változók az osztályon belüli metódusokból elérhetőek, azonban kívülről nem látszanak, alapértelmezetten private hatókörrel bírnak, melyet megváltoztatni nem lehet.

Elemi adattípusok

Anytype: Minden adattípussal használható, az összes elemi adattípus őse. Hasonló a C# object típusához. Mielőtt az anytype típusú változót használnánk, értéket kell adni neki. Az első értékadás meghatározza az anytype változó tényleges típusát, azaz értékadást követően típust változtatni nem lehetséges. Az értékadáskor a konverzió automatikus.

anytype a; ; a = "text"; // Assigns a string literal

Boolean: Logikai igaz, vagy hamis értékeket tartalmaz. Helyettesíthető a beépített felsorolt típussal: NoYes:No, NoYes:Yes, valamint az integer típussal. Az integer típussal való helyettesítéskor a típuskonverzió automatikusan végrehajtásra kerül. Egy byte-on tárolja a rendszer ezt a típust. Egész értékkel való megfeleltetés, mint C++ -ban. (0: False, 1: True)

Date: dőpontokat tartalmaz, nap, hónap és év részekkel. Ez a típus az időt nem tartalmazza! Literálként is leírható, azaz:

date d3 = 21\11\1998;
Integer változónak történő értékadáskor a típuskonverzió automatikus.

Enum: Felsorolt adattípus. Számos beépített rendszerbeli felsorolt típus létezik. Az X++ nem támogatja a konstansok használatát, helyettük az enum-ot javasolja. A belső reprezentáció az egész típus, de használata literálok listájaként lehetséges. Definiáláskor lehetséges a literál név mögött elhelyezkedő egész érték beállítása. A kezdőérték 0-tól indul, de nem a kötelező legkisebb érték a nulla. Lehet más intervallumot is definiálni a 0 - 250 -es egész számok tartományában. Kifejezésekben használható a felsorolt típus sorszámának megfelelő egész értéke is. Például: SalesType::Order = 0, SalesType::BackOrder = 1. Automatukus konverzió történik boolean, integer, real típussal történő hasonlításkor, illetve értékadáskor. Explicit típuskonverzió megadása nem szükséges, de nem okoz hibát.

GUID: A globálisan egyedi azonosító. X + +-ban a GUID típusnak felel meg. 32 digiten hexadecimális számjegyekbő áll. 36, vagy 38 hosszúságú. 8-4-4-4-12 elrendezésben szerepel, string reprezentációban. Guid típus konverziója explicit történik, azaz nem automatikus. A konverziós függvények használata értékadáskor, vagy kifejezések használatában kötelező! Példa a konverzióra:

guid guid2; str string3; ; // Convert a guid to a string, and back to a guid. guid2 = newGuid(); info(strFmt("Info_a1: guid2 == %1", guid2)); string3 = guid2str(guid2); info(strFmt("Info_a2: string3 == %1", string3)); guid2 = str2guid(string3); info(strFmt("Info_a3: guid2 == %1", guid2));

Integer típusok: egész értékek tárolása
Kétféle reprezentációban van jelen a nyelvben: 32 bites egész (alapértelmezés, nem kell jelölni hogy Int32) 64 bites egész (külön jelölni kell, azaz Int64) 32 bites egész értelmezési tartománya: [-2,147,483,647 ; 2,147,483,647]. 64 btes egész értelmezési tartománya: [-9,223,372,036,854,775,808 ; 9,223,372,036,854,775,808] Integer literál mindenhol használható, ahol integer típusú változót használnánk. Értékadáskor, kifejezésekben automatikus konverzió történik a boolean, a real és az enum típusokra.
Léteznek explicit konverziós lehetőségek is: str2int, int2str, str2int64, int642str
Változó deklarálásra példa:

// Declaration of an integer variable, i int i; // Declaration of two int64 variables int64 i1, i2; // An integer variable is initialized to the value 100 int i3 = 100; // Declaration of a dynamic array of integers int i4[];
Ha deklaráláskor nem adunk meg kezdőértéket, akkor az int típusú változó 0-ra definiálása az alapértelmezés.

Real: lebegőpontos típus
Decimális értékek is tárolható benne. Többnyire a nagypontosságú számításokhoz használják, de a pénznem adat típusa is real. Belső reprezentáció BCD kódolásban van. A BCD kódolás lehetővé teszi, hogy nagyon pontosan történjen az értékek ábrázolása. Értelmezési tartománya: -(10)127-ediken - től (10) 127-ediken -ig. 64 biten ábrázolva. Használható literálként is, mindenhol, ahol real változó használható. Példa a delkarálásra:

real r; ; r = 1.000e3; r = 1.2345e+3; r = 1.2345e+03; rr = 1234.5e40;

Automatikus konverzió az integer, boolean és az enum típusokkal kapcsolatosan lehetséges. Aritmetikai és relációs operátorokkal használható. Explicit típuskonverziós lehetőségei: str2num, num2str

String: Karakterláncok, karaktersorozatok.
Karakterek, szövegek, például címek, telefonszámok adattípusaként használatos. X ++, kulcsszava stringek deklarálására az str kulcsszó. A stringbe meghatározatlan számú karakter fér. Ha előre definiálható a felhasználni kívánt maximum karakter szám, akkor a string deklarálható fix karakterszám tárolására. Ekkor azonban, ha a definiált hossznál nagyobb hosszúságú karakterlánc kerül értékadásra az eredmény csonkolva lesz.Összehasonlításkor lehetőség van annak megválasztására, hogy hogyan szeretnénk két stringet összehasonlítani. LeftAligned, RightAligned, azaz bal oldalról ,vagy jobb oldalról indítva is történhet az összehasonlítás. String literálokat idézőjelek közé kell tenni. Az idézőjel helyett állhat egyszerű aposztróf is. A kétféle jelölés egyenértékű.
Példa stringekdeklarációra:

//Dynamic string of unlimited length str indefiniteString; //String with a maximum of 100 characters, initialized to "A" str 100 maxLengthString = "A"; //Left-aligned string with maximum length of 30
str 30 left leftAlignedString;

Hosszú karakterlánc több sorba is törhető, ekkor azonban használni kell az idézőjel előtt a "@" operátort. Ha a deklarációs részben nem határozuk meg az értékét, akkor alapértelmezett érték az üres string. Kifejezésekben, értékadó műveletekben használható a string összefűző operátor: "+" Implicit konverzió ezzel a típussal nem működik. Explicit konverziós megoldások a nyelv elemei: str2int, str2int64, int2str, str2num, num2str, str2date, date2str

TimeOfDay: Integer érték, másodpercben mérve az éjfél óta eltelt idő. Értelmezési tartománya [0; 86400]. zárt intervallum, maximális értéke 86400 (23:59:59)
Példa a deklarációra:

//Declaration of a time variable, time1 timeOfDay time1; //Declaration and initialization of a time variable to 00:21:35 timeOfDay time2 = 1295;

Ugyanazok a műveletek érvényesek,melyek az integer típusra. 32 biten tárolódik, automatikus típuskonverzió érvényes az integer, enum és boolean típusokkal kapcsolatban. Alapértelmezett kezdőértéke a nulla. Explicit konverziós lehetőségek a nyelvbe beépített módon elérhetőek: str2time, time2str

UtcDateTime
A Date és a TimeOfDay típus felhasználásával született ez az új alaptípus. Segítségével kifejezhető a dátum és az idő egy típus felhasználásával. Időzóna információkat is tartalmaz. Az érték készlete a típusnak zárt intervallum: [1900-01-01T00:00:00] - [2154-12-31T23:59:59] Alapértelmezett kezdőértéke az intervallum alsó korlátja. Nincs beépített típuskonverzió a nyelvben erre az adattípusra. Az általános összehasonlító operátorok érvényesek, használhatóak a típussal.

Összetett adattípusok

Tömbök
Az array típus segítségével tömböket hozhatunk létre. A tömb azonos típusú elemek indexelt sorozata. A tömb elemeinek számozása 0-val kezdődik, tehát a tömb első eleme a 0.-ik pozíción lesz tárolva. Háromféleképpen deklarálható adott hosszúságú, dinamikus, vagy "részben diszken helyet foglaló" lehet. Az adott hosszúságú tömbök a deklarációnál definiált számú elemet tartalmazhatnak, míg a dinamikus tömbök lehetővé teszik, hogy a tömb mérete változtatható legyen.

Adott méretű tömb deklarálása: real r[100]; Dinamikus tömb létrehozása: int i[];

A deklarációs részben a tömb nem inicializálható. A tömb elemei automatikusan inicializálódnak a elem típusának alapértelmezett inicializáló értékére. Részben a diszken helyet foglaló tömb deklarálása:
str arrayVariable [ 1000,200];

módon történik. Az első paraméterben átadott érték a tömbelemek számára lefoglalandó helyek száma, a második paraméterben pedig azt lehet megadni, hogy hány elem kerüljön a memóriába, ha a tömbre referencia hivatkozás történik. Az így megadott elemek beolvasása a memóriába automatikusan megtörténik. A nyelv nem támogatja a töbdimenziós tömböket.

Konténerek
A Container típus segítségével gyüjteményeket hozhatunk létre. Elemei nem csak egyféle típussal rendelkezhetnek, hanem bármilyen típus előfordulhat egymást követő elemeiben. Például lehetőség van integer, boolean, valamint Date típusú értékek egyetlen gyüjteményben történő szerepeltetésére. Érték típussal rendelkezik a gyüjtemény típus, azaz alprogramnak nem referenciaként kerül áttadásra.
Példa a deklarálásra:

container variable2 ,variable33; ; variable2 += [98]; variable33 = variable2; variable2 += [97];

A két konténer változó különböző konténerekre vonatkozik, a két konténer sohasem lesz egyenlő. Számos művelet végezhető a konténerrel. conPeek, kivesz a konténerből egy meghatározott indexű elemet, conIns beteszt egy elemet,conNull megvizsgálja a kollekciót, hogy nem üres-e? A konténer mérete létrehozás után nem változtatható! Indexelése "1"-el kezdődik.
A konténer elemeinek tárolására AnyType típus szolgál. A konverzió, a konténermanipuláló metódusok esetén automatikus.
Bizonyos konténerműveletek esetén a teljes adattartalom másolásra kerül, mely performancia csökkenséhez vezethet. Gyorsabb művelet += (plusz egyenlő) az elemek hozzáadására, mint a conIns függvény használata. A container típus a nyelv korábbi verzióiban is jelen volt, azonban az újabb kiadásokban új gyüjteménytípusok kerülek a nyelvbe. Manapság inkább a List típus használát javasolják helyette. Fontos megjegyezni, hogy a Container adattípus nem osztály! Ebben különbözik a nyelv többi gyüjteményeitől.

List osztály adattípus
Szekvenciálisan elérhető elemek gyüjteménye. Egyféle típusú elemeket tartalmazhat, melyek bármilyen X++ típusok lehetnek, többnyire objektumok gyüjteményeként használt. class List extends Object, vagyis az ősosztálya az Object osztály. A lista deklarálásakor meg kell adni a lista elemeinek adattípusát. Ez később nem változtatható.
Példa a lista deklarációra:

// Create a list of integers List il = new List(Types::Integer); ; // Add some elements to the list il.addEnd(1); il.addStart(3);
Számos beépített függvény segíti a listák kezelését. ListEnumerator típus használatára szükség lehet listákkal történő műveletvégzés esetén. A lista kezelése gyors, hatékony megoldás nagyméretű adattartalmak memóriabeli tárolására.

Set osztály adattípus
Amennyiben nem fontos az elemek sorrendje, akkor elemek gyüjteményosztályaként használható ez a típus. class Set extends Object Hasonlóan a List típushoz elemei egyféle típusúak lehetnek, melyhez bármilyen X++ -ban létező típuso felhasználható.Egy elem csak egyszer kerül tárolásra ebben a gyüjtemény jellegű adattípusban. Az elemekhez való hozzáférés a "SetEnumerator" osztály segítségével történik. Ime egy rövid példa a Set használatára:

Set noConfigs; Set yesConfigs; ConfigId configId; SetEnumerator se; ; se = noConfigs.getEnumerator(); while (se.moveNext()) { configId = se.current(); if (yesConfigs.in(configId)) { yesConfigs.remove(configId); } }

Map osztály
Más programozási nyelvekben asszociatív tömbként ismert. A java-ban van hasonló tulajdonságokkal rendelkező beépített adattípus. Az elemek kulcsukkal érhetőek el, a keresés, rendezés gyorsabb, mint más gyüjteményosztályban. A kulcsok és az értékek típus X++ elemi típus, vagy objektum is lehet. Egy értékhez csak egy kulcs tartozhat. Ugyanazzal a kulccsal egy új elem hozzáadása azt jelenti, hogy a régi érték elvész, helyettesítésre kerül az újjal. A kollekción történő végiglépkedéshez a MapEnumerator nevű segédosztály használata szükséges. Példa a Map használatára:

Deklaráció: Map example; // Fill in a few values. example = new Map(Types::Integer, Types::String); example.insert (1, "one"); example.insert (2, "two");

A nyelv számos beépített függvényt tartalmaz az adattípus kezelésére.

Struct osztály
Akárcsak a korábbi összetett típusok, ennek a típusnak az őse is az Object. X++ típusú elemek meghatározott csoportját tároló adattípus. Valahol az osztályok és a konténerek között helyezkedik el. Leszármaztatni nem lehet belőle, a benne lévő adatok vagy a mező nevével, vagy a mező indexével lehetséges. A deklarációs részben inicializálható. Példa a Struct használatára:

Struct s = new struct ("int age; str name"); ; // Add values to the items s.value("age", 25); s.value("name", "Jane Dow"); // Add a new item; data type is inferred from value s.add("Shoesize", 45);