AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Die Delphi-IDE [D2006] Bug? class operator Inc & Implicit -> Falsch
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von chaosben · begonnen am 12. Jun 2007 · letzter Beitrag vom 13. Jun 2007
Antwort Antwort
Benutzerbild von chaosben
chaosben

Registriert seit: 27. Apr 2005
Ort: Görlitz
1.358 Beiträge
 
Delphi XE2 Professional
 
#1

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

  Alt 12. Jun 2007, 11:56
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.
Benjamin Schwarze
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

Registriert seit: 27. Apr 2005
Ort: Görlitz
1.358 Beiträge
 
Delphi XE2 Professional
 
#2

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

  Alt 13. Jun 2007, 17:11
*push*
Benjamin Schwarze
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#3

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

  Alt 13. Jun 2007, 17:48
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
I am a leaf on the wind - watch how I soar
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

Registriert seit: 27. Apr 2005
Ort: Görlitz
1.358 Beiträge
 
Delphi XE2 Professional
 
#4

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

  Alt 13. Jun 2007, 21:05
Danke für den Hinweise.
Des Rätsels Lösung ist folgende fehlerhafte Zeile in der Hilfe (an die ich mich gehalten habe):
Zitat von Die Delphi-Hilfe ©Borland:
Operator - Kategorie - Deklarationssignatur
Inc - Unär - Inc(a: Typ): Ergebnistyp;
Benjamin Schwarze
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)
  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 14:15 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