Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Die Delphi-IDE (https://www.delphipraxis.net/62-die-delphi-ide/)
-   -   [D2006] Bug? class operator Inc & Implicit -> Falsch (https://www.delphipraxis.net/93847-%5Bd2006%5D-bug-class-operator-inc-implicit-falsch.html)

chaosben 12. Jun 2007 10:56


[D2006] Bug? class operator Inc & Implicit -> Falsch
 
Hi!

Ehe ich im QualityCentral einen großen Aufstand mache, will ich gern von euch wissen, ob das ein Bug oder ein Feature ist.

Beschreibung:
Benutzt man das Inc-Kommando mit einem Record, dessen Klassenoperatoren "Inc" und der implizite Typecast zu "Integer" definiert sind, gibt ein Inc Aufruf mit einem Parameter (oder zwei [Wert des zweiten=1]) einen sinnlosen Wert zurück. Übergibt man indessen als zweiten Parameter einen Wert größer als 1 oder definiert den impliciten Typecast zu Integer nicht, geht alles seinen gewohnten Gang.

Getestet in:
D2006 Enterprise

Programm zum Nachvollziehen:

Delphi-Quellcode:
program bugtest;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type
  TMyRecord = record
    Data : Integer;

    class operator Implicit(ARecord : TMyRecord) : Integer;
    class operator Add(ARecord : TMyRecord; AInteger : Integer) : TMyRecord;
    class operator Inc(AAmount : Integer) : TMyRecord;
  end;

{ TMyRecord }

class operator TMyRecord.Add(ARecord: TMyRecord; AInteger: Integer): TMyRecord;
begin
  Result.Data:=ARecord.Data+AInteger;
  writeln('Adding ',AInteger,' to ',ARecord.Data, '=>', Result.Data);
end;

class operator TMyRecord.Implicit(ARecord: TMyRecord): Integer;
begin
  Result:=ARecord.Data;
  Writeln('Casting ', ARecord.Data, ' as Integer =>',Result);
end;

class operator TMyRecord.Inc(AAmount: Integer): TMyRecord;
begin
  Writeln('Inc ', Result.Data, ' by ', AAmount);
  Result:=Result+AAmount;
end;

var
  mr : TMyRecord;

begin
  mr.Data:=5;

  Inc(mr, 2);

  Writeln('Next line has to show "7"');
  Writeln(mr.Data);

  writeln('----------------------');

  mr.Data:=5;

  Inc(mr, 1);

  Writeln('Next line has to show "6"');
  Writeln(mr.Data);

  Readln;
end.

chaosben 13. Jun 2007 16:11

Re: [D2006] Bug? class operator Inc & Implicit -> Fal
 
*push*

xaromz 13. Jun 2007 16:48

Re: [D2006] Bug? class operator Inc & Implicit -> Fal
 
Hallo,

Du hast einen Fehler in Deiner Deklaration:
Delphi-Quellcode:
class operator TMyRecord.Inc(AAmount: Integer): TMyRecord;
begin
  Writeln('Inc ', Result.Data, ' by ', AAmount);
  Result:=Result+AAmount;
end;
Was soll denn hier erhöht werden? Result ist undefiniert und eine Klassenmethode kann auf keine Objekt-Member zugreifen.

Richtig ist die Implementierung des Operators Inc so:
Delphi-Quellcode:
class operator TMyRecord.Inc(ARecord: TMyRecord; AAmount: Integer): TMyRecord;
begin
  Writeln('Inc ', ARecord.Data, ' by ', AAmount);
  Result:=ARecord+AAmount;
end;
Du musst ja angeben, welchen Record Du bearbeiten willst.

Gruß
xaromz

chaosben 13. Jun 2007 20:05

Re: [D2006] Bug? class operator Inc & Implicit -> Fal
 
Danke für den Hinweise.
Des Rätsels Lösung ist folgende fehlerhafte Zeile in der Hilfe (an die ich mich gehalten habe):
Zitat:

Zitat von Die Delphi-Hilfe ©Borland
Operator - Kategorie - Deklarationssignatur
Inc - Unär - Inc(a: Typ): Ergebnistyp;



Alle Zeitangaben in WEZ +1. Es ist jetzt 06:43 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