Ebben a fejezetben bemutatjuk, hogy hogyan lehet futásidőben kiírattatni a különböző típusú változók által használt memóriaterület tartalmát. Ehhez először írunk egy olyan eljárást, mely paraméterként megkapja a kiíratandó változót, a változó által használt memóriaterület hosszát, érték vagy referencia típusát, valamint az esetlegesen kiíratandó információt. Ebben az eljárásban megfigyelhető a pointerek viselkedése, hogyan kell egy paraméterként kapott változót pointerként használni. A példákban megmutatjuk néhány típusra az eljárás használatát.
procedure kiir(var value; length : integer; cimszerint : boolean; caption : string);
var s, s1 : string;
i : integer;
p : ^byte;
begin
if cimszerint then
begin
if caption <> '' then writeln(caption);
s := s+IntToHex(Integer(@value),8)+': ';
p := @value;
for i := 0 to 3 do
begin
s := s + IntToHex(Byte(p^),2)+' ';
inc(p);
end;
writeln(s);
s := '';
p := ptr(Integer(value));
end
else begin
if caption <> '' then writeln(caption);
p := @value;
end;
if (p = nil) then exit;
for i := 0 to length-1 do
begin
if (i mod 16) = 0 then
begin
if i <> 0 then writeln(s + s1);
s := IntToHex(Integer(p),8)+': ';
s1 := ''
end;
s := s + IntToHex(Byte(p^),2)+' ';
if Byte(p^) >= 32 then s1 := s1 + chr(Byte(p^))
else s1 := s1 + '.';
inc(p);
end;
for i := system.length(s1)+1 to 16 do s1 := s1 + '.';
for i := system.length(s) to 57 do s := s + ' ';
writeln(s+s1);
end;
var pint : ^integer;
i : integer;
begin
writeln('Tipusos pointerek:');
writeln('');
writeln('var <name> : ^<type>;');
writeln('var pint : ^integer;');
writeln(' i : integer;');
writeln('');
kiir(pint,sizeOf(integer),true,'');
writeln('');
writeln('i := $01020304;');
i := $01020304;
kiir(i,sizeOf(integer),false,'');
writeln('');
writeln('pint := @i;');
writeln('');
pint := @i;
kiir(pint,sizeOf(integer),true,'');
writeln('');
writeln('pint^ := $ffffffff;');
writeln('');
pint^ := $ffffffff;
kiir(pint,sizeOf(integer),true,'pint : ^integer;');
kiir(i,sizeOf(integer),false,'i : integer;');
writeln('');
writeln('Memoria foglalas: New(pint);');
new(pint);
writeln('');
kiir(pint,sizeOf(integer),true,'');
writeln('');
writeln('Ertekadas: pint^ := $01020304;');
writeln('');
pint^ := $01020304;
kiir(pint,sizeOf(integer),true,'');
writeln('');
writeln('Memoria cime: Integer(@pint) vagy Integer(addr(pint)); - ('+IntToHex(Integer(@pint),8)+')');
writeln('Mutatott memoria cim: Integer(Ptr(Integer(@pint))^) - ('+IntToHex(Integer(Ptr(Integer(@pint))^),8)+')');
writeln('Erteke: Integer(pint^) - ('+IntToHex(Integer(pint^),8)+')');
writeln('');
writeln('Megszuntetes: Dispose(pint);');
end;

var pp : pointer;
i : integer;
begin
writeln('Tipus nelkuli pointerek:');
writeln('');
writeln('var <name> : pointer;');
writeln('var pp : pointer;');
writeln('');
kiir(pp,sizeOf(integer),false,'');
writeln('');
writeln('Memoria foglalas: GetMem(pp,32);');
writeln('');
GetMem(pp,32);
kiir(pp,32,true,'');
writeln('');
writeln(' FillChar(pp^,32,#0);');
writeln('');
FillChar(pp^,32,#0);
kiir(pp,32,true,'');
writeln('');
writeln('for i := 0 to 31 do PByte(Integer(Ptr(Integer(@pp))^)+i)^ := i;');
writeln('');
for i := 0 to 31 do PByte(Integer(Ptr(Integer(@pp))^)+i)^ := i;
kiir(pp,32,true,'');
writeln('');
writeln('Megszuntetes: FreeMem(pp);');
end;

procedure ParamInteger(i : integer);
begin
kiir(i,SizeOf(Integer), false,'');
end;
procedure ParamVarInteger(var i : integer);
begin
kiir(i,SizeOf(Integer), false,'');
end;
var i : integer;
db : double;
bool : boolean;
begin
i := $01020304;
writeln('var i : integer;');
writeln(' i := $01020304;');
writeln('');
kiir(i,SizeOf(Integer), false,'');
writeln('');
writeln('procedure ParamInteger(i : integer) : integer;');
ParamInteger(i);
writeln('');
writeln('procedure ParamVarInteger(var i : integer) : integer;');
ParamVarInteger(i);
writeln('');
writeln('var db : double');
writeln(' db := 0');
db := 0;
writeln('');
kiir(db,sizeof(db),false,'');
writeln('');
writeln(' db := 3.14');
db := 3.14;
writeln('');
kiir(db,sizeof(db),false,'');
writeln('');
writeln('var bool : boolean;');
writeln('');
bool := false;
writeln(' bool := false;');
kiir(bool,1,false,'');
writeln('');
bool := true;
writeln(' bool := true;');
kiir(bool,1,false,'');
end;

type MyColor = (mcRed, mcBlue, mcGreen, mcYellow, mcOrange);
MySetNumber = set of 0..255;
var Color : MyColor;
Answer : (ansYes, ansNo, ansMaybe);
MySet: set of ''a''..''z'';
SetNumber: MySetNumber;
begin
writeln('type MyColor = (mcRed, mcBlue, mcGreen, mcYellow, mcOrange);');
writeln('var Color : MyColor;');
writeln('');
kiir(Color,SizeOf(Color),false,'');
writeln('');
writeln('Color := mcGreen;');
Color := mcGreen;
kiir(Color,SizeOf(Color),false,'');
writeln('');
writeln('var Answer : (ansYes, ansNo, ansMaybe);');
writeln('');
kiir(Answer,SizeOf(Answer),false,'');
writeln('');
writeln('Answer := ansMaybe;');
Answer := ansMaybe;
writeln('');
kiir(Answer,SizeOf(Answer),false,'');
writeln('');
writeln('var MySet: set of ''a''..''z'';');
writeln('');
kiir(MySet,SizeOf(MySet),false,'');
writeln('');
writeln('MySet := [''a'',''b'',''c'',''d''];');
MySet := ['a','b','c','d'];
kiir(MySet,SizeOf(MySet),false,'');
writeln('');
writeln('MySet := [''z''];');
MySet := ['z'];
kiir(MySet,SizeOf(MySet),false,'');
writeln('');
writeln('type MySetNumber = set of 0..255;');
writeln('var SetNumber: MySetNumber;');
writeln('');
kiir(SetNumber,SizeOf(SetNumber),false,'');
writeln('');
SetNumber := [0..15];
writeln('SetNumber := [0..15];');
kiir(SetNumber,SizeOf(SetNumber),false,'');
writeln('');
SetNumber := [0..255];
writeln('SetNumber := [0..255];');
kiir(SetNumber,SizeOf(SetNumber),false,'');
end;

var s : string;
s1 : string[11];
begin
writeln('var s : string;');
writeln('');
kiir(s,4, false,'');
writeln('');
writeln(' s := ''Hello Word!'';');
writeln('');
s := 'Hello Word!';
kiiroffset(s,4,length(s), true,'');
writeln('');
writeln('procedure ParamString(s : string) : string;');
ParamString(s);
writeln('');
kiir(s,length(s), true,'');
writeln('');
writeln('procedure ParamVarString(var s : string) : string;');
ParamVarString(s);
writeln('');
kiir(s,length(s), true,'');
writeln('');
writeln(' s := '''';');
writeln('');
s := '';
kiir(s,length(s), true,'');
writeln('');
writeln(' s := ''Hello Word!'';');
writeln('');
s := 'Hello Word!';
kiir(s,length(s),true,'');
writeln('');
for i := 1 to length(s) do kiir(s[i],SizeOf(char),false,'s['+IntToStr(i)+']');
writeln('');
writeln('s := '''';');
s := '';
kiir(s,length(s),true,'');
writeln('');
writeln('for i := 0 to 32 do');
writeln(' begin');
writeln(' s2 := '''';');
writeln(' for j := 0 to 4 do s2 := s2 + chr(random(27)+65);');
writeln(' s := s + s2;');
writeln(' end;');
writeln('');
for i := 0 to 32 do
begin
s2 := '';
for j := 0 to 3 do s2 := s2 + chr(random(27)+65);
s := s + s2;
if (i mod 8) = 0 then
begin
kiiroffset(s,4,length(s),true,'');
writeln('');
end;
end;
writeln('var s1 : string[11];');
writeln(' s1 := ''Hello Word!'';');
writeln('');
s1 := 'Hello Word!';
kiir(s1,length(s1)+1, false,'');
writeln('');
s1 := 'ELTE';
writeln(' s1 := ''ELTE'';');
kiir(s1,length(s1)+1, false,'');
kiir(s1,12, false,'');
writeln('');
writeln(' s1 := ''Ez itt egy hosszabb szoveg!'';');
s1 := 'Ez itt egy hosszabb szoveg!';
kiir(s1,length(s1)+1, false,'');
end;

var s : string;
pc : PChar;
begin
writeln('var pc : PChar;');
writeln('');
kiir(pc,sizeOf(pchar),false,'');
writeln('');
writeln(' pc := ''Hello Word!'';');
writeln('');
pc := 'Hello Word!';
kiir(pc,length(pc)+1,true,'');
writeln('');
writeln(' try');
writeln(' StrCopy(pc,''Hello Word!!'');');
writeln(' except on E: Exception do writeln(E.Message); end;');
writeln('');
try
StrCopy(pc,'Hello Word!!');
except on E: Exception do writeln(E.Message); end;
writeln('');
writeln(' pc := PChar(s);');
writeln('');
pc := PChar(s);
kiir(pc,length(pc)+1,true,'');
writeln('');
writeln(' s := s + ''xxx'';');
writeln('');
s := s + 'xxx';
kiiroffset(s,4,length(s),true,'');
writeln('');
kiir(pc,length(pc)+1,true,'');
writeln('');
writeln(' pc := nil;');
writeln('');
pc := nil;
kiir(pc,length(s)+1,true,'');
writeln('');
writeln(' GetMem(pc,length(s)+1);');
writeln('');
GetMem(pc,length(s)+1);
kiir(pc,length(s)+1,true,'');
writeln('');
writeln(' FillChar(pc^,length(s)+1,#0);');
writeln('');
FillChar(pc^,length(s)+1,#0);
kiir(pc,length(s)+1,true,'');
writeln('');
writeln(' StrCopy(pc,PChar(s));');
writeln('');
StrCopy(pc,PChar(s));
kiir(pc,length(s)+1,true,'');
end;

Szerző: Appel Ágnes, Bakos Natália, Nagy Róbert