VÁLTOZTATÁSOK ADATTÍPUSOK KÖZÖTT
Az Object Pascal amikor lehetséges, átalakításokat végez különböző fájltípusok közt. Nézzük meg a köv. kódrészletet példának okáért:
var
Res : SmallInt;
Num1 : Integer;
Num2 : Integer;
{ Later... }
Num1 := 200;
Num2 := 200;
Res := Num1 * Num2;
Ebben az esetben megpróbáltam kiosztani két változó sokszorosításának az eredményét egy SmallInt-be. Még ez a formáció is két adattípusból van, az Object Pascal viszont itt képes konverzációt végezni köztük. Szeretnéd tudni az eredményt? Meglepődsz bizonyára, mert az eredmény –25,536. Ha pedig megnézed az 1.1-es táblát, láthatod, hogy a SmallInt-nek maximum értéke 32,767 lehet. Mi történik, ha veszel egy maximum értékű SmallInt-et, 32,767-tel, és hozzáadsz 1-et? Megkapod a –32,768 értéket. Ez alapvetően olyan, mint amikor a kilométeróra 99,999-ről 00,000-ra változik, mikor megteszed az utolsó mérföldet. Hogy lásd, kövesd a köv. lépéseket:
1. Kezdj egy új alkalmazást és a „label”-t és a „button”-t tedd a lapra.
2. Kettős kattintás a „button”-ra, készíts egy eseményvezérlőt (event handler) a gomb „OnClick” eseményéhez.
3. Módosítsd az eseményvezérlőt, hogy az a következőképpen nézzen ki:
procedure TForm1.Button1Click(Sender: TObject);
var
X : SmallInt;
begin
X := 32767;
X := X + 1;
Label1.Caption := IntToStr(X);
end;
4. Futtasd a programot, és kattints a gombra.
És most látni fogod, hogy a címke szövege –32768-ra változott, mikor rákattintottál a gombra (ebben az esetben csodálkozhatsz talán, hogy az IntToStr egész értéket fordított a parancssorba.) Ez a feladat megmutatta, hogy 32767 meg 1 egyenlő –32768! Oké, végülis nem teljesen.
Ez a példa valójában illusztrálta azt, amit úgy ismerünk, hogy overflow vagy wrapping. (overflow- túlcsordulás, wrapping- betűrés)
Tehát felismerheted, hogy a változóid maximum lehetséges értékei tartalmazhatják és megválaszthatják az adattípust, ami elég nagy ahhoz, hogy garantálja hogy az értéket túlcsordulás nélkül a változón belül.
A legtöbb esetben nem tudsz olyan messzire menni, hogy hiba történjen, ha egész változót használsz. Elég valószínűtlen, hogy a betűréssel találkozol, mert az Integer adattípus –2 billió és +2 billió közti intervallumot ad meg értelmezési tartományként.
Ajaj, hol is tartottam? Ja, persze, az automatikus fájlkonvertálásról beszéltem. Szóval, vannak olyan esetek, amikor az Object Pascal nem tudja ezt végrehajtani. Ha ez az eset merül fel, kapsz egy fordító hibaüzenetet, ami valami ilyesmit fog kiírni az Incompatible (nem kompatíbilis) fájl-sorok között:
’Integer’ és ’Real’.
Ez a hibaüzenet azt jelenti, hogy te egy értéket akartál kifejezni, amit ebben az adattípusban nem lehet tárolni. Egy másik fordítóhiba, amivel találkozhatsz, azt „range checking”nek hívják.( Intervallum-ellenőrzés )
Nézzük ezt a kódot:
var
X : Byte;
begin
X := 1000;
end;
Ez a kód fordítóhibát okoz, mert a „konstanskifejezés megsértette az értékhatárokat”. A fordító azt üzeni neked, hogy nem oszthatsz ki 1000-s értéket az X változóhoz, ami Byte-tal van kifejezve, mert egy Byte csak 0 és 255 között tarthat értékeket.
>>Folytatás...
|