A Delphi programozási nyelv

Pointerek gyakorlati használata

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;

Típusos pointerek viselkedése

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;

Típus nélküli pointerek viselkedése

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;

Integer, double és boolean típusú változók viselkedése

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;

Felsorolás és részhalmaz típusú változók viselkedése

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;

String típusú változók viselkedése

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;

PChar típusú változók viselkedése

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;

Letölthető fájlok

pointer_demo.zip (Méret: 61 831 bájt)

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