Operator = funktioniert nicht mit Dynamischen Strukturen ..

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Operator = funktioniert nicht mit Dynamischen Strukturen ..

Beitrag von corpsman »

Code: Alles auswählen

Type
  TBlab = Array[0..1] Of Single;

  TBlubber = Array Of Single;

Implementation

Operator + (a, b: TBlubber ): TBlubber;
Begin

End;

Operator = (a, b: TBlubber ): Boolean;
Begin

End; 
Will man das opbige Compilieren kommt bei der Zeile Operator =
unit1.pas(34,37) Error: Impossible operator overload
Ich kann nicht so ganz nachvollziehen warum das nicht gehen soll...

Weis einer von euch den Grund, eine Lösung ?
--
Just try it

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

Re: Operator = funktioniert nicht mit Dynamischen Strukturen ..

Beitrag von Mathias »

So viel ich weis sind diese Operatoren für dynamische Array schon implementiert.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Operator = funktioniert nicht mit Dynamischen Strukturen ..

Beitrag von corpsman »

Dann würde es direkt compilieren, wenn ich nen Vergleich wie

Code: Alles auswählen

var a,b:TBlubber;
begin
 if a = b then
..
schreibe. tut es aber nicht => das Typsystem müsste die Fälle ja auch unterscheiden können, tut es aber nicht.
--
Just try it

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

Re: Operator = funktioniert nicht mit Dynamischen Strukturen ..

Beitrag von Mathias »

Beim = weiss ich es nicht genau, aber ich vermute, da werden nur die Zeiger zur Array verglichen.
Aber das + funktioniert definitiv.


Code: Alles auswählen

{$modeswitch arrayoperators}  

var
  a, b, c: array of char;
  i: integer;
begin
  a := 'abc';
  b := '123';
  c := a + b;

  for i := 0 to Length(c) - 1 do begin
    Write(c[i]);
  end;
end; 
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

PascalDragon
Beiträge: 825
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Operator = funktioniert nicht mit Dynamischen Strukturen ..

Beitrag von PascalDragon »

corpsman hat geschrieben:
Do 24. Sep 2020, 06:44
Weis einer von euch den Grund, eine Lösung ?
Du kannst nur Operatoren überladen, die nicht bereits durch den Compiler bereit gestellt werden. Diese haben immer Vorrang. Auch der +-Operator für dynamische Arrays kann dir mit 3.2.0 einen Strich durch die Rechnung machen, wenn der Modeswitch ArrayOperators aktiviert ist (Standard in Mode Delphi, + ist dann Array Konkatenation).

Wenn du frei in den Operatoren sein willst, dann musst du dein Array in ein record packen und am Besten dort die Operatoren definieren (das erlaubt es außerdem die Operatoren auch innerhalb von Generics zu verwenden; Hinweis: benötigt in nicht-Delphi Modi den Modeswitch AdvancedRecords).
FPC Compiler Entwickler

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Operator = funktioniert nicht mit Dynamischen Strukturen ..

Beitrag von corpsman »

@PascalDragon
Danke für die schöne Erleuterung, da muss ich meine Architektur noch mal überdenken...
--
Just try it

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

Re: Operator = funktioniert nicht mit Dynamischen Strukturen ..

Beitrag von Mathias »

Anstelle von Operatoren überladen, könnte ich dir noch type helper enpfehlen.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Operator = funktioniert nicht mit Dynamischen Strukturen ..

Beitrag von corpsman »

Eine Funktion die die Variablen Vergleicht zu schrieben ist ja kein Ding, die Helper kenne ich, aber irgendwie kann ich mich noch nicht damit anfreunden..

Habs grad noch mal geprüft, der Compiler wirft tatsächlich keinen Fehler, wenn ich TBlubber mit TBlubber vergleiche. Ich hätte hier erwartet das das Typsystem den Unterschied zwischen Pointer auf dynamisches Array und TBlubber erkennt.

Auf jedenfall wieder was gelernt, danke für den Gedankenaustausch.
--
Just try it

PascalDragon
Beiträge: 825
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Operator = funktioniert nicht mit Dynamischen Strukturen ..

Beitrag von PascalDragon »

corpsman hat geschrieben:
Do 24. Sep 2020, 12:06
Habs grad noch mal geprüft, der Compiler wirft tatsächlich keinen Fehler, wenn ich TBlubber mit TBlubber vergleiche. Ich hätte hier erwartet das das Typsystem den Unterschied zwischen Pointer auf dynamisches Array und TBlubber erkennt.
Ein dynamisches Array ist implizit ein Pointertyp. Es ist auch legal SomeArray := Nil zu schreiben, um ein dynamisches Array freizugeben.
FPC Compiler Entwickler

Antworten