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