![]() |
Frage zu "absolute"
Ich bin in einem Projekt (eigentlich für Freepascal) über folgenden Code gestolpert (vereinfacht):
Delphi-Quellcode:
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.
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; Mein Verständnis bzgl. "absolute" sollte folgenden Code als identisch ansehen:
Delphi-Quellcode:
Bitte korrigiert mich, falls ich falsch liege.
procedure TNeueKlasee.Irgendwas;
var MySock: TNeuerSocket; begin MySock := TNeuerSocket(FSocket); ... end; |
Re: Frage zu "absolute"
Fast.
Wenn FSocket zwischenzeitlich einen neuen Wert bekommt, kriegt das MySock nicht mit. |
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:
[add2] @DevilsCamp: Delphi meckert bei deinem code übigens auch :angel: Zitat:
Delphi-Quellcode:
die D2009-OH kennt absolute wohl nicht und D7 sagt
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; Zitat:
|
Re: Frage zu "absolute"
Zitat:
Und Danke für die Bestätigung. |
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 |
Re: Frage zu "absolute"
Zitat:
|
Re: Frage zu "absolute"
Zitat:
|
Re: Frage zu "absolute"
Zitat:
Zitat:
|
Re: Frage zu "absolute"
Habe folgendes getestet (mit Freepascal, Delphi steht mir im Moment nicht zur Verfügung):
Delphi-Quellcode:
Als Ergebnis bekomme ich:
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.
Code:
Ersetze ich die Methode TKlasse2.GetTest durch:
Test = 10
Test = 20 Test = 20
Delphi-Quellcode:
dann erhalte ich ebenfalls
function TKlasse2.GetTest: Longint;
var ei: TKla2; // absolute Ftest; begin ei := TKla2(Ftest); ei.Feins := 20; Result := FTest.Feins; end;
Code:
Das Typecasting verhält sich (zumindest bei diesem Test) genauso wie es sich mit absolute verhalten sollte.
Test = 10
Test = 20 Test = 20 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 01:01 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz