AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Frage zu "absolute"

Ein Thema von DevilsCamp · begonnen am 17. Mär 2009 · letzter Beitrag vom 17. Mär 2009
Antwort Antwort
DevilsCamp
(Gast)

n/a Beiträge
 
#1

Frage zu "absolute"

  Alt 17. Mär 2009, 10:06
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.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Frage zu "absolute"

  Alt 17. Mär 2009, 10:49
Fast.
Wenn FSocket zwischenzeitlich einen neuen Wert bekommt, kriegt das MySock nicht mit.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#3

Re: Frage zu "absolute"

  Alt 17. Mär 2009, 10:50
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 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
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.
$2B or not $2B
  Mit Zitat antworten Zitat
DevilsCamp
(Gast)

n/a Beiträge
 
#4

Re: Frage zu "absolute"

  Alt 17. Mär 2009, 11:04
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.
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.800 Beiträge
 
Delphi 12 Athens
 
#5

Re: Frage zu "absolute"

  Alt 17. Mär 2009, 11:43
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
Oliver
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#6

Re: Frage zu "absolute"

  Alt 17. Mär 2009, 11:57
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
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: Frage zu "absolute"

  Alt 17. Mär 2009, 12:35
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 ....?
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
DevilsCamp
(Gast)

n/a Beiträge
 
#8

Re: Frage zu "absolute"

  Alt 17. Mär 2009, 13:10
Zitat von himitsu:
[add2]
@DevilsCamp: Delphi meckert bei deinem code übigens auch
Zitat:
[DCC Fehler] Unit1.pas(64): E2088 Variable erwartet
Dann bin ich ja beruhigt


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.
  Mit Zitat antworten Zitat
DevilsCamp
(Gast)

n/a Beiträge
 
#9

Re: Frage zu "absolute"

  Alt 17. Mär 2009, 14:01
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).
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:06 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