Személyes eszközök
Keresés

 

A InfoWiki wikiből

(Változatok közti eltérés)
(Új oldal, tartalma: „<cim cim3="Felsorolás típus" cim2="Magasszintű Programozási Nyelvek I." cim1="Imperatív, procedurális nyelvek alapjai" prev="mp1/page550" next="mp1/page850" ...”)
(Felsorolás típus)
15. sor: 15. sor:
-
= Felsorolás típus =
+
== A probléma ==
 +
Az alapvető típusok (int, double, char, bool, stb) a programok és a további típusok alapvető építőkövei.
 +
Mivel nyelvi alaptípusok - a program szövegébe épített értékeiket (literálok alakja) a fordítóprogram
 +
felismeri.
 +
 +
Gyakori azonban az az eset, amikor ezen típusok által lefedett értékek halmaza túlságosan bő. Tegyük fel
 +
például, hogy egy énekkari kórustagok hangjának jellegét kívánjuk (sok más adatuk mellett) programban
 +
tárolni. A hangzástípusok csakis a bariton, alt, tenor, mezoszoprán, szoprán értékek közül kerülhet
 +
ki. Nincs olyan típus a C#-ban (és más nyelven sem valószínű), amely csakis ilyen értékeket fogad el.
 +
 +
Ilyenkor a szokásos eljárás, hogy az egyes lehetséges értékeket kódoljuk. Pl. bariton lesz a 0, alt az 1,
 +
stb. A típus amire szükségünk lesz, valamely egész szám típus, hiszen ebben tudjuk majd tárolni a
 +
tényleges értékek kódjait.
 +
 +
Egyrészt vegyük észre, hogy máris kompromisszumot kötöttünk - nem a tényleges értékeket tároljuk, hanem
 +
azok kódjait. Ezen még tudunk segíteni valamelyest a konstansok használatával (bár ki fog derülni, hogy
 +
nem sokat):
 +
 +
<code lang="csharp">
 +
const int bariton = 0;
 +
const int alt = 1;
 +
const int tenor = 2;
 +
const int mezoszopran = 3;
 +
const int szopran = 4;
 +
</code>
 +
 +
Ez máris mutatja, hogy amennyiben egy konkrét énekes konkrét énekhangját akarnánk tárolni, akkor az '''int'''
 +
típust (vagy valamelyik egész szám típust) tudnánk használni:
 +
 +
<code lang="csharp">
 +
int enrico_caruso_hangja = tenor;
 +
</code>
 +
 +
Vegyük azonban észre, hogy a fenti kód az alábbi módon is írható:
 +
<code lang="csharp">
 +
int enrico_caruso_hangja = 2;
 +
</code>
 +
 +
Valamint vegyük észre, hogy az alábbi kód sem jelez szintaktikai hibát:
 +
 +
<code lang="csharp">
 +
int enrico_caruso_hangja = -42312;
 +
</code>
 +
 +
A szóban forgó változó fizikailag képes ezen lehetetlen érték tárolására, a fordítóprogramnak meg nem adtunk
 +
semmilyen támpontot hogy ellenőrízhesse, és kizárhassa ezt a logikailag hibás értéket. Szűkíthetnénk a lehetséges
 +
értékek halmazát az által pl, hogy nem az '''int''', hanem egy kisebb típust használunk:
 +
 +
 +
<code lang="csharp">
 +
byte enrico_caruso_hangja = -42312; // hibás
 +
</code>
 +
 +
A '''byte''' típus nem enged meg negatív értékeket, ez okozza a fenti kód szintaktikai hibáját, és nem
 +
az, hogy nincs ilyen hangfekvés-kód. A fordítónak semmilyen ötlete nincs arról, hogy mik a lehetséges
 +
hangfekvés kódok, e miatt a byte esetén is működne az alábbi kód:
 +
 +
<code lang="csharp">
 +
byte enrico_caruso_hangja = 178;
 +
</code>
 +
 +
Tovább bonyolítja a helyzetet, hogy programunkban más jellegű konstansokat is felvehetnénk:
 +
 +
<code lang="csharp">
 +
// termék minőségek
 +
const int megfelelt = 0;
 +
const int turheto = 1;
 +
const int jo = 2;
 +
const int kivalo = 3;
 +
</code>
 +
 +
Mivel ezek mind-mind egy egész számot neveznek el, a hangzások kódolása is egész számok segítségével történik,
 +
ezért az alábbi kódok nem hibásak a fordító szerint:
 +
 +
<code lang="csharp">
 +
byte enrico_caruso_hangja = megfelelt; // gyak. a bariton kódja
 +
if (enrico_caruso_hangja==turheto) {...} // hangja alt ??
 +
while (enrico_caruso_hangja>0) {...} // ebből mi akar lenni??
 +
</code>
 +
 +
Tehát ezen ''kódolásos'' megoldás fizikailag megoldja a gondjainkat, a programokban ezen a módon
 +
végül is tudjuk tárolni az énekesek hanját (ha nem rontjuk el), de a programunkban ezt a dolgot
 +
csakis a mi jó szándékunk tartja életben. A fordítóprogram nem segít nekünk ellenőrízni a kódunk
 +
helyességét, nem szól, ha hangfekvés jellegű változóinkba illegális értéket akarunk helyezni,
 +
és a programunk szövegének utólagos (vagy mások által történő) olvasgatása során a típusinformáció
 +
nem ad támpontot a változók szerepének megértésében.
 +
 +
== Felsorolt típus ==
<alairas>Hernyák Zoltán</alairas>
<alairas>Hernyák Zoltán</alairas>
__NOTOC__
__NOTOC__

A lap 2009. december 17., 07:54-kori változata


A probléma

Az alapvető típusok (int, double, char, bool, stb) a programok és a további típusok alapvető építőkövei. Mivel nyelvi alaptípusok - a program szövegébe épített értékeiket (literálok alakja) a fordítóprogram felismeri.

Gyakori azonban az az eset, amikor ezen típusok által lefedett értékek halmaza túlságosan bő. Tegyük fel például, hogy egy énekkari kórustagok hangjának jellegét kívánjuk (sok más adatuk mellett) programban tárolni. A hangzástípusok csakis a bariton, alt, tenor, mezoszoprán, szoprán értékek közül kerülhet ki. Nincs olyan típus a C#-ban (és más nyelven sem valószínű), amely csakis ilyen értékeket fogad el.

Ilyenkor a szokásos eljárás, hogy az egyes lehetséges értékeket kódoljuk. Pl. bariton lesz a 0, alt az 1, stb. A típus amire szükségünk lesz, valamely egész szám típus, hiszen ebben tudjuk majd tárolni a tényleges értékek kódjait.

Egyrészt vegyük észre, hogy máris kompromisszumot kötöttünk - nem a tényleges értékeket tároljuk, hanem azok kódjait. Ezen még tudunk segíteni valamelyest a konstansok használatával (bár ki fog derülni, hogy nem sokat):

const int bariton = 0;
const int alt = 1;
const int tenor = 2;
const int mezoszopran = 3;
const int szopran = 4;

Ez máris mutatja, hogy amennyiben egy konkrét énekes konkrét énekhangját akarnánk tárolni, akkor az int típust (vagy valamelyik egész szám típust) tudnánk használni:

int enrico_caruso_hangja = tenor;

Vegyük azonban észre, hogy a fenti kód az alábbi módon is írható:

int enrico_caruso_hangja = 2;

Valamint vegyük észre, hogy az alábbi kód sem jelez szintaktikai hibát:

int enrico_caruso_hangja = -42312;

A szóban forgó változó fizikailag képes ezen lehetetlen érték tárolására, a fordítóprogramnak meg nem adtunk semmilyen támpontot hogy ellenőrízhesse, és kizárhassa ezt a logikailag hibás értéket. Szűkíthetnénk a lehetséges értékek halmazát az által pl, hogy nem az int, hanem egy kisebb típust használunk:


byte enrico_caruso_hangja = -42312; // hibás

A byte típus nem enged meg negatív értékeket, ez okozza a fenti kód szintaktikai hibáját, és nem az, hogy nincs ilyen hangfekvés-kód. A fordítónak semmilyen ötlete nincs arról, hogy mik a lehetséges hangfekvés kódok, e miatt a byte esetén is működne az alábbi kód:

byte enrico_caruso_hangja = 178;

Tovább bonyolítja a helyzetet, hogy programunkban más jellegű konstansokat is felvehetnénk:

// termék minőségek
const int megfelelt = 0;
const int turheto = 1;
const int jo = 2;
const int kivalo = 3;

Mivel ezek mind-mind egy egész számot neveznek el, a hangzások kódolása is egész számok segítségével történik, ezért az alábbi kódok nem hibásak a fordító szerint:

byte enrico_caruso_hangja = megfelelt; // gyak. a bariton kódja
if (enrico_caruso_hangja==turheto) {...} // hangja alt ??
while (enrico_caruso_hangja>0) {...} // ebből mi akar lenni??

Tehát ezen kódolásos megoldás fizikailag megoldja a gondjainkat, a programokban ezen a módon végül is tudjuk tárolni az énekesek hanját (ha nem rontjuk el), de a programunkban ezt a dolgot csakis a mi jó szándékunk tartja életben. A fordítóprogram nem segít nekünk ellenőrízni a kódunk helyességét, nem szól, ha hangfekvés jellegű változóinkba illegális értéket akarunk helyezni, és a programunk szövegének utólagos (vagy mások által történő) olvasgatása során a típusinformáció nem ad támpontot a változók szerepének megértésében.

Felsorolt típus

Hernyák Zoltán
A lap eredeti címe: „http://wiki.ektf.hu/wiki/Mp1/page560
Nézetek
nincs sb_3.144.86.138 cikk