Pascal: Saját típusnak megadott típus miért nem viselkedik sorszámozott típusként (más értékeket is felvesz, túlcsordul)?
Definiálok egy saját típust, ez miért nem válik automatikusan olyanná, hogy értékkészletéből csak a definiált értékeket vehesse fel, semmi mást? (mint pl. a byte, amely 0..255 értéket vehet fel, vagy összes többi sorszámozott típust említhetném)...
Range check bekapcsolásával kiakad, ezt értem, de miért nem szabályozza le a fordító, hogy csak bizonyos értékeket vehessen fel a változó?
FPC fejlesztőinek ezt nem lenne érdemes javasolni, vagy ez teljesen jó így és én értek félre valamit?
Én logikám szerint úgy kellene működnie, hogy hiába növelem, az 1,2,3 értékeken kívül mást nem vehetne fel és így menne körbe-körbe...
program pelda;
type
valtozotip = 1..3;
var
v : valtozotip;
i : byte;
begin
v := 1;
for i := 1 to 14 do
inc(v);
WriteLn(v);
v := 1;
for i := 1 to 14 do
v:=succ(v);
WriteLn(v);
ReadLn;
end.
Ezt nem, így kell.
Intervallum tipusra keress rá.
A résztartomány típusú (subrange type) változók annyi helyet foglalnak, amennyi a legkisebb megcímezhetõ memória.
Például:
type valtozotip = 1..3;
var v : valtozotip;
A "valtozotip" típusú változók 1 bájton lesznek tárolva. Vagyis úgy lesznek tárolva, mint a "Byte" típusú változók.
Attól függ, hogy mennyi bájton, és milyen beépített típusként lesznek tárolva, hogy milyen intervallumot adsz meg. Lásd a következõ táblázatot:
Byte = 0..255;
Shortint = -128..127;
Word = 0..65535;
Integer = -32768..32767;
Longint = $80000000..$7fffffff;
A {$R+} direktívával bekapcsolhatod a futás idejû tartomány ellenõrzést.
Például:
type
valtozotip = 1..3;
var
v : valtozotip;
i : byte;
begin
{$R+}
try
v := 1;
for i := 1 to 14 do
Inc(v);
WriteLn(v);
except
WriteLn('Variable is out of range. (',v,')');
end;
ReadLn;
end.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!