Problem mit Advanced Records und überladenen Operatoren

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Problem mit Advanced Records und überladenen Operatoren

Beitrag von theo »

Kann den einfachen Freepascal Code bitte mal jemand gegechecken?

Aus meiner Sicht dürfte nach dem Anwenden des überladenen Operators (R := ansistring('test2');) fAnyVar nicht 0 werden.
Denke ich falsch, oder ist das ein Fall für den Bugtracker?

Code: Alles auswählen

program project1;
 
{$mode objfpc}{$H+}
{$MODESWITCH ADVANCEDRECORDS}
 
type
 
  { TTestAdvRec }
 
  TTestAdvRec = record
  private
    fText: ansistring;
    fAnyVar: integer;
  public
    procedure SetString(const AValue: ansistring);
    function GetString: ansistring;
  end;
 
  operator := (r: ansistring) z: TTestAdvRec;
  begin
    z.SetString(r);
    writeln('setting AnsiString');
  end;
 
  { TTestAdvRec }
 
  procedure TTestAdvRec.SetString(const AValue: ansistring);
  begin
    fText := AValue;
  end;
 
  function TTestAdvRec.GetString: ansistring;
  begin
    Result := fText;
  end;
 
var
  R: TTestAdvRec;
 
begin
  R.fAnyVar := 38;
  R.SetString('test1');
  Writeln(R.GetString);
  Writeln(R.fAnyVar);
  R := ansistring('test2')//<----- löscht die Daten des Records bzw. erstellt eine neue Instanz?
  Writeln(R.GetString);
  Writeln(R.fAnyVar); //<---- gibt 0
end.                         

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Problem mit Advanced Records und überladenen Operatoren

Beitrag von Socke »

Bei der Zuweisung von Records wird der Zielspeicher mit dem Quellspeicher überschrieben (sowie referenzgezählte Datentypen hoch/runter gezählt).

Vielleicht sind die Entwickler gewillt, dieses Verhalten zu ändern oder in den überladenen Operatoren Zugriff auf den ursprünglichen Record zu gewähren.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

BeniBela
Beiträge: 308
Registriert: Sa 21. Mär 2009, 17:31
OS, Lazarus, FPC: Linux (Lazarus SVN, FPC 2.4)
CPU-Target: 64 Bit

Re: Problem mit Advanced Records und überladenen Operatoren

Beitrag von BeniBela »

Bei mir wird es nicht 0, sondern

Code: Alles auswählen

 
test1
38
setting AnsiString
test2
6458904
 

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Problem mit Advanced Records und überladenen Operatoren

Beitrag von theo »

Socke hat geschrieben:Bei der Zuweisung von Records wird der Zielspeicher mit dem Quellspeicher überschrieben (sowie referenzgezählte Datentypen hoch/runter gezählt).

Vielleicht sind die Entwickler gewillt, dieses Verhalten zu ändern oder in den überladenen Operatoren Zugriff auf den ursprünglichen Record zu gewähren.


Ich bin aber der Meinung, keinen Record zuzuweisen, sondern ich weise nur einen Ansistring zu, was ein SetString auf dem bestehenden Record ausführt.
Falsch?

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Problem mit Advanced Records und überladenen Operatoren

Beitrag von theo »

BeniBela hat geschrieben:Bei mir wird es nicht 0, sondern

Code: Alles auswählen

 
test1
38
setting AnsiString
test2
6458904
 


Ja, danke. Es geht nur darum, dass es nicht 38 bleibt.

Mathias
Beiträge: 6193
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Problem mit Advanced Records und überladenen Operatoren

Beitrag von Mathias »

Bei mir ist fAnyVar auch 0, verwende Linux.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Problem mit Advanced Records und überladenen Operatoren

Beitrag von theo »

Danke.
Habe es geklärt. Die Entwickler sagen, das muss so sein.
Es ist für mich nicht gerade offensichtlich oder wünschenswert. Aber so ist es nun mal.

Mathias
Beiträge: 6193
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Problem mit Advanced Records und überladenen Operatoren

Beitrag von Mathias »

Ich habe mal etwas ganz brutales probiert, anstelle des records eine classe verwendet.

Code: Alles auswählen

begin
  R:=TTestAdvRec.Create;
  R.fAnyVar := 38;
  R.SetString('test1');
  Writeln(R.GetString);
  Writeln(R.fAnyVar);
  R := ansistring('test2')//<----- löscht die Daten des Records bzw. erstellt eine neue Instanz?
  Writeln(R.GetString);
  Writeln(R.fAnyVar); //<---- gibt 0
  R.Free;
end.   



Code: Alles auswählen

test1
38
Runtime error 216 at $000000000040A8C5
  $000000000040A8C5
  $0000000000400256


Das sowas überhaupt kompiliert wird.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

BeniBela
Beiträge: 308
Registriert: Sa 21. Mär 2009, 17:31
OS, Lazarus, FPC: Linux (Lazarus SVN, FPC 2.4)
CPU-Target: 64 Bit

Re: Problem mit Advanced Records und überladenen Operatoren

Beitrag von BeniBela »

theo hat geschrieben:.
Habe es geklärt. Die Entwickler sagen, das muss so sein.


Link?

edit: hier? http://bugs.freepascal.org/view.php?id=29476

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Problem mit Advanced Records und überladenen Operatoren

Beitrag von theo »

BeniBela hat geschrieben:
theo hat geschrieben:.
Habe es geklärt. Die Entwickler sagen, das muss so sein.


Link?

edit: hier? http://bugs.freepascal.org/view.php?id=29476


Ja. Nun gut. Für mich ist diese Logik nicht zwingend, aber meine Vorstellung ist anscheinend schwierig zu implementieren.

Antworten