![]() |
AW: Properties haben nach Zuweisung falsche Werte
Mit ShortStrings funktionierts, d.h. irgendwie verpointert der sich.
|
AW: Properties haben nach Zuweisung falsche Werte
Zitat:
Delphi-Quellcode:
Edit: Andersrum gemischt geht's dann doch wieder:
function TForm1.GetDebitorName: string;
var a:Tadresse; begin a:=GetReAdr; Result := a.Vorname + ' ' + GetReAdr.Name; end;
Delphi-Quellcode:
Result := GetReAdr.Vorname + ' ' + a.Name;
|
AW: Properties haben nach Zuweisung falsche Werte
Es hat offenbar etwas mit der internen Realisierung des String-Results als var-Parameter und der nicht-vorhandenen Referenzzählung bei String-Konstanten zu tun. Aber da mögen sich die Compiler-Leute von Embarcadero dran auslassen.
Wer schreibt den QC? |
AW: Properties haben nach Zuweisung falsche Werte
Das ist ein "Fehler" im CodeHiglighting, dann das kann dieses nicht richtig auflösen, nur anhand eines Codeabschnittes.
"Name" ist nur reserviert, innerhalb einer Property-Deklaration und bei Prozedurimporten (wo es wiederum der SyntaxHighlighter in der IDE nicht hinbekommt) |
AW: Properties haben nach Zuweisung falsche Werte
Zitat:
|
AW: Properties haben nach Zuweisung falsche Werte
Da der Fehler erst durch Deinen Thread bekannt geworden ist, lehne ich mich mal weit aus dem Fenster und behaupte, dass das so immer funktionieren sollte. Haftbar lasse ich mich für diese Aussage allerdings nicht machen :angel2:
|
AW: Properties haben nach Zuweisung falsche Werte
Selbst so geht es nicht:
Delphi-Quellcode:
Irgendwie kann ich mir nicht vorstellen, dass noch nie jemand seit Delphi 6 so eine Property mit einem Getter genutzt hat und dass das erst jetzt auffällt.
property AdrProp: TAdresse read GetAdrProp write SetAdrProp;
function TForm1.GetAdrProp: TAdresse; begin Adresse.Vorname := 'a'; Adresse.Name := 'b'; result := Adresse; end; |
AW: Properties haben nach Zuweisung falsche Werte
Zitat:
Delphi-Quellcode:
und der Zusammensetzung des Ergebnisses. Hier versucht der Compiler offenbar eine coole Optimierung und fällt dabei auf die Klappe. Es scheint ja gut zu funktionieren, wenn man die Strings nicht mit einem zweimaligen Aufruf der Funktion zusammensetzt. Die Felder der TAdresse-Instanz sind ja durchaus korrekt. Es ist das Concat was schief geht.
GetReAdr
Auf den zweimaligen Aufruf hatte ich ja schon anfangs hingewiesen. Offenbar ist er nicht nur redundant sondern auch schädlich. |
AW: Properties haben nach Zuweisung falsche Werte
Egal ob Optimierung an oder aus, stimmt.
Und noch interessanter: Der Fehler besteht nur beim Win32-Compiler, bei Win64 nicht. Andere Compiler kann ich nicht testen. Könnte man folgendes als Minimalbeispiel in die QC eintragen?
Delphi-Quellcode:
Oder ginge das noch kürzer?
program Project4;
{$APPTYPE CONSOLE} type TMyClass = class one, two: String; end; var globalInstance: TMyClass; function getInstance(): TMyClass; begin if not Assigned(globalInstance) then globalInstance := TMyClass.Create(); globalInstance.one := 'one'; globalInstance.two := 'two'; Result := globalInstance; end; function getBoth(): String; var oneCopy, twoCopy: String; begin oneCopy := getInstance().one; twoCopy := getInstance().two; WriteLn( oneCopy + ' ' + twoCopy ); Result := getInstance().one + ' ' + getInstance().two; end; begin WriteLn( getBoth() ); // Output on DCC32: //one two //two two // Output on DCC64: //one two //one two end. |
AW: Properties haben nach Zuweisung falsche Werte
Wäre es denn im konkreten Fall nicht besser, das ganze Konstrukt irgendwie zu ändern?
Eine Prozedur FillAdresse, die die Felder füllt und dann die Funktion, die die gewünschten Felder "concatiert" (gibt's das?) ausgibt? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:22 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