this slowpoke moves

Reference Variable

Beispiel 1:
program Reference1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type
  PStringInfo = ^TStringInfo;
  TStringInfo = packed record
    iRefCount   : Integer;
    iLenCount   : Integer;
    pStringAddr : Pointer;
  end;

procedure ShowStringInfo(const s: String);
var
  p: PStringInfo;
begin
  p := Pointer(s);
  Dec(Integer(p), 8);

  WriteLN(Format('  String:        %s', [s]));
  WriteLn(Format('  p.RefCount:    %d', [p^.iRefCount]));
  WriteLn(Format('  p.LenCount:    %d', [p^.iLenCount]));
end;

var
  s, s2: String;

begin
  WriteLn('Geben sie einen Text ein:');
  ReadLn(s);
  WriteLn;

  WriteLn('Der eingegebene Text wird einer zweiten Variable zugewiesen');
  WriteLn('  s2 := s;');
  s2 := s;
  WriteLn;

  WriteLn('Inhalt von s:');
  ShowStringInfo(s);
  WriteLN(Format('  Pointer(s):    0x%p', [Pointer(s)]));
  WriteLN(Format('  @s:            0x%p', [@s]));
  WriteLn;

  WriteLn('Inhalt von s2:');
  ShowStringInfo(s2);
  WriteLN(Format('  Pointer(s2):   0x%p', [Pointer(s2)]));
  WriteLN(Format('  @s2:           0x%p', [@s2]));
  
  ReadLn;
end.

Beispiel 2:
program Reference2;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type
  PStringInfo = ^TStringInfo;
  TStringInfo = packed record
    iRefCount   : Integer;
    iLenCount   : Integer;
    pStringAddr : Pointer;
  end;

procedure ShowStringInfo(const s: String);
var
  p: PStringInfo;
begin
  p := Pointer(s);
  Dec(Integer(p), 8);
  
  WriteLN(Format('  String:        %s', [s]));
  WriteLn(Format('  p.RefCount:    %d', [p^.iRefCount]));
  WriteLn(Format('  p.LenCount:    %d', [p^.iLenCount]));
end;

var
  s, s2: String;

begin
  WriteLn('Geben sie einen Text ein (mind. 2 Zeichen):');
  ReadLn(s);
  WriteLn;

  WriteLn('Der eingegebene Text wird einer zweiten Variable zugewiesen');
  WriteLn('  s2 := s;');
  s2 := s;
  WriteLn;

  WriteLn('Inhalt von s:');
  ShowStringInfo(s);
  WriteLN(Format('  Pointer(s):    0x%p', [Pointer(s)]));
  WriteLN(Format('  @s:            0x%p', [@s]));
  WriteLn;

  WriteLn('Inhalt von s2:');
  ShowStringInfo(s2);
  WriteLN(Format('  Pointer(s2):   0x%p', [Pointer(s2)]));
  WriteLN(Format('  @s2:           0x%p', [@s2]));
  WriteLn;

  WriteLn('Variable s wird nun direkt an Position 2 verändert');
  WriteLn('  s[2] := ''X''');
  s[2] := 'X';
  WriteLn;

  WriteLn('Inhalt von s:');
  ShowStringInfo(s);
  WriteLN(Format('  Pointer(s):    0x%p', [Pointer(s)]));
  WriteLN(Format('  @s:            0x%p', [@s]));
  WriteLn;

  WriteLn('Inhalt von s2:');
  ShowStringInfo(s2);
  WriteLN(Format('  Pointer(s2):   0x%p', [Pointer(s2)]));
  WriteLN(Format('  @s2:           0x%p', [@s2]));  
  ReadLn;
end.

Beispiel 3:
program Reference3;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type
  PStringInfo = ^TStringInfo;
  TStringInfo = packed record
    iRefCount   : Integer;
    iLenCount   : Integer;
    pStringAddr : Pointer;
  end;

procedure ShowStringInfo(const s: String);
var
  p: PStringInfo;
begin
  p := Pointer(s);
  Dec(Integer(p), 8);

  WriteLN(Format('  String:        %s', [s]));
  WriteLn(Format('  p.RefCount:    %d', [p^.iRefCount]));
  WriteLn(Format('  p.LenCount:    %d', [p^.iLenCount]));
end;

var
  s, s2: String;

begin
  WriteLn('Geben sie einen Text ein (mind. 2 Zeichen):');
  ReadLn(s);
  WriteLn;

  WriteLn('Der eingegebene Text wird einer zweiten Variable zugewiesen');
  WriteLn('  s2 := s;');
  s2 := s;
  WriteLn;

  WriteLn('Inhalt von s:');
  ShowStringInfo(s);
  WriteLN(Format('  Pointer(s):    0x%p', [Pointer(s)]));
  WriteLN(Format('  @s:            0x%p', [@s]));
  WriteLn;

  WriteLn('Inhalt von s2:');
  ShowStringInfo(s2);
  WriteLN(Format('  Pointer(s2):   0x%p', [Pointer(s2)]));
  WriteLN(Format('  @s2:           0x%p', [@s2]));
  WriteLn;

  WriteLn('Variable s wird nun INdirekt an Position 2 verändert');
  WriteLn('  PChar(Cardinal(Pointer(s)) + 1)^ := ''X''');
  PChar(Cardinal(Pointer(s)) + 1)^ := 'X';
  WriteLn;

  WriteLn('Inhalt von s:');
  ShowStringInfo(s);
  WriteLN(Format('  Pointer(s):    0x%p', [Pointer(s)]));
  WriteLN(Format('  @s:            0x%p', [@s]));  
  WriteLn;

  WriteLn('Inhalt von s2:');
  ShowStringInfo(s2);
  WriteLN(Format('  Pointer(s2):   0x%p', [Pointer(s2)]));
  WriteLN(Format('  @s2:           0x%p', [@s2]));
  ReadLn;
end.

Keine Kommentare:

Kommentar veröffentlichen

Beliebte Posts

Translate