Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Frage zu "absolute" (https://www.delphipraxis.net/130993-frage-zu-absolute.html)

DevilsCamp 17. Mär 2009 09:06


Frage zu "absolute"
 
Ich bin in einem Projekt (eigentlich für Freepascal) über folgenden Code gestolpert (vereinfacht):

Delphi-Quellcode:
interface

type
  TBasisSocket = class
  end;

  TNeuerSocket = class(TBasisSocket)
  public
    function MachWas: Integer;
  end;
 
  TBasisKlasse1 = class
  private
    FSocket: TBasisSocket;
  public
    constructor Create;
    destructor Destroy; override;
  end;
 
  TNeueKlasse = class(TBasisKlasse1)
  public
    procedure Irgendwas;
  end;
 
implementation

procedure TNeuerSocket.MachWas;
begin
  Result := FurchtbarWichtigeBerechnung * 3;
end;

constructor TBasisKlasse1.Create;
begin
  FSocket := TBasisSocket.Create;
end;

destructor TBasisKlasse1.Destroy;
begin
  FSocket.Free;
 
  inherited Destroy;
end;

procedure TNeueKlasee.Irgendwas;
var
  MySock: TNeuerSocket absolute FSocket;
begin
  ...
end;
Ich verwende bei Freepascal den SVN-Tree (also Version 2.3.1). Seit einer mir unbekannten Revision meldet der Compiler nun, dass "absolute" nur bei VAR- oder CONST-Werten verwendet werden darf.

Mein Verständnis bzgl. "absolute" sollte folgenden Code als identisch ansehen:
Delphi-Quellcode:
procedure TNeueKlasee.Irgendwas;
var
  MySock: TNeuerSocket;
begin
  MySock := TNeuerSocket(FSocket);
  ...
end;
Bitte korrigiert mich, falls ich falsch liege.

sirius 17. Mär 2009 09:49

Re: Frage zu "absolute"
 
Fast.
Wenn FSocket zwischenzeitlich einen neuen Wert bekommt, kriegt das MySock nicht mit.

himitsu 17. Mär 2009 09:50

Re: Frage zu "absolute"
 
jupp, ist richtig ... es wirdpraktisch nur eine neue Variable erstellt, welche aber im selben Speicher liegt, wie die andere Variable, welche per "absolute" angegeben wird. (bei nicht gleichgroßen Variablen liegt der Anfang des Speichers übereinander und weiter der jeweils erste Teil, welcher noch gleich groß ist)

[add]
Zitat:

Zitat von sirius
Fast.
Wenn FSocket zwischenzeitlich einen neuen Wert bekommt, kriegt das MySock nicht mit.

sicher? (mal ausprobier)

[add2]
@DevilsCamp: Delphi meckert bei deinem code übigens auch :angel:
Zitat:

[DCC Fehler] Unit1.pas(64): E2088 Variable erwartet
a und result haben immer den selben Wert ... bei deiner Beschreibung würde Delphi den Wert für result kopieren und eine neue Variable erstellen.
Delphi-Quellcode:
function xyz: integer;
var a: longword absolute result;
begin
  a := 123;
  if a = 1 then ;
  if result = 1 then ;
  result := 456;
  if a = result then ;
  a := 789;
  if a = result then ;
end;
die D2009-OH kennt absolute wohl nicht und D7 sagt
Zitat:

Sie können eine neue Variable an der Adresse erstellen, an der bereits eine Variable existiert.
...
Diese Anweisung legt fest, dass die Variable StrLen an derselben Adresse wie die Variable Str beginnt. Da das erste Byte eines kurzen Strings dessen Länge angibt, ist der Wert von StrLen die Länge von Str.

DevilsCamp 17. Mär 2009 10:04

Re: Frage zu "absolute"
 
Zitat:

Zitat von sirius
Fast.
Wenn FSocket zwischenzeitlich einen neuen Wert bekommt, kriegt das MySock nicht mit.

Das wäre egal. FSocket wird nur ausserhalb von "Irgendwas" verändert.

Und Danke für die Bestätigung.

Sherlock 17. Mär 2009 10:43

Re: Frage zu "absolute"
 
Hmmm, so egal kann das nicht sein, sonst hätte man es nicht verwendet. Die Änderungen werden natürlich auch in der anderern Richtung "bemerkt"...nur so als Gedanke.

Sherlock

himitsu 17. Mär 2009 10:57

Re: Frage zu "absolute"
 
Zitat:

Zitat von Sherlock
Hmmm, so egal kann das nicht sein, sonst hätte man es nicht verwendet. Die Änderungen werden natürlich auch in der anderern Richtung "bemerkt"...nur so als Gedanke.

Sherlock

wenn beide Variablen den selben Speicherort verwenden, dann hätten sie automatisch den selben Inhalt, welcher in diesem Speicher liegt und zwar sofort/gleichzeitig :angel2:

sirius 17. Mär 2009 11:35

Re: Frage zu "absolute"
 
Zitat:

Zitat von Sherlock
Hmmm, so egal kann das nicht sein, sonst hätte man es nicht verwendet. Die Änderungen werden natürlich auch in der anderern Richtung "bemerkt"...nur so als Gedanke.
Sherlock

Die Änderungen im Objekt ja, aber wenn ich FSocket ein komplett neues Objekt zuweise ....?

DevilsCamp 17. Mär 2009 12:10

Re: Frage zu "absolute"
 
Zitat:

Zitat von himitsu
[add2]
@DevilsCamp: Delphi meckert bei deinem code übigens auch :angel:
Zitat:

[DCC Fehler] Unit1.pas(64): E2088 Variable erwartet

Dann bin ich ja beruhigt :)


Zitat:

Zitat von Sherlock
Hmmm, so egal kann das nicht sein, sonst hätte man es nicht verwendet.

Schwer zu sagen. Ich habe mir den QuellCode aber nochmal angeschaut und musste feststellen, dass der/die Entwickler des Codes die "absolute"-Variable nur lesenderweise verwendet. Es wird weder in FSocket noch in MySock geschrieben. absolute wurde wohl nur verwendet um eine Zeile im Quellcode zu sparen.

DevilsCamp 17. Mär 2009 13:01

Re: Frage zu "absolute"
 
Habe folgendes getestet (mit Freepascal, Delphi steht mir im Moment nicht zur Verfügung):
Delphi-Quellcode:
program hilfe;

{$mode objfpc}{$H+}

uses SysUtils, Classes;

type
  TKla1 = class
  public
    Feins: Longint;
  end;
 
  TKla2 = class(TKla1)
  public
    Fzwei: Longint;
  end;
 
  TKlasse1 = class
  public
    Ftest: TKla1;

    constructor Create;
    destructor Destroy; override;
  end;
 
  TKlasse2 = class(TKlasse1)
  public
    function GetTest: Longint;
  end;

constructor TKlasse1.Create;
begin
  Ftest := TKla1.Create;
  Ftest.Feins := 10;
end;

destructor TKlasse1.Destroy;
begin
  Ftest.Free;
 
  inherited Destroy;
end;

function TKlasse2.GetTest: Longint;
var
  ei: TKla2; // absolute Ftest;
begin
  ei := TKla2(Ftest);
  Ftest.Feins := 20;
  Result := ei.Feins;
end;
 
var
  bla: TKlasse2;
begin
  bla := TKlasse2.Create;
  WriteLn(Format('Test = %d', [bla.Ftest.Feins]));
  WriteLn(Format('Test = %d', [bla.GetTest]));
  WriteLn(Format('Test = %d', [bla.Ftest.Feins]));
  bla.Free;
end.
Als Ergebnis bekomme ich:
Code:
Test = 10
Test = 20
Test = 20
Ersetze ich die Methode TKlasse2.GetTest durch:
Delphi-Quellcode:
function TKlasse2.GetTest: Longint;
var
  ei: TKla2; // absolute Ftest;
begin
  ei := TKla2(Ftest);
  ei.Feins := 20;
  Result := FTest.Feins;
end;
dann erhalte ich ebenfalls
Code:
Test = 10
Test = 20
Test = 20
Das Typecasting verhält sich (zumindest bei diesem Test) genauso wie es sich mit absolute verhalten sollte.
Allerdings habe ich jetzt nicht getestet, wie es mit Typen aussieht, die keine Objekte sind (z.B. Double <-> Int64).


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:24 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz