operator überladen

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
u-boot
Beiträge: 308
Registriert: Do 9. Apr 2009, 10:10
OS, Lazarus, FPC: Ubuntu 9.10 (L 0.9.28 FPC 2.2.4)
CPU-Target: 32Bit
Wohnort: 785..

operator überladen

Beitrag von u-boot »

Ich wollte für die GNURZ ein paar Operatoren den funktionen zuweisen.
Zu der Zeile:

Code: Alles auswählen

operator := (const a:integer) result:GNZTyp;
erscheint die Fehlermeldung:

Code: Alles auswählen

gnurz.pas(104,12) Fatal: Syntax error, "=" expected but ":=" found
Guck ich nur mal wieder am eigenen Fehler vorbei oder ist mein Compiler zu alt oder gibts für Operatordefinitionen mehr Einschränkungen ?
Ubuntu 9.10 (L 0.9.28 FPC 2.4.x)

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

Re: operator überladen

Beitrag von theo »

So ein Test kompiliert bei mir

Code: Alles auswählen

GNZTyp=Record end;
 
operator := (const a:integer) res:GNZTyp;
Lazarus 1.1 r37533M FPC 2.7.1 x86_64-linux-gtk 2

"Result" würde ich da nicht nehmen.

u-boot
Beiträge: 308
Registriert: Do 9. Apr 2009, 10:10
OS, Lazarus, FPC: Ubuntu 9.10 (L 0.9.28 FPC 2.2.4)
CPU-Target: 32Bit
Wohnort: 785..

Re: operator überladen

Beitrag von u-boot »

Gnurz gibt vor: (sry zu wenig Info von mir)

Code: Alles auswählen

GNZTyp = array of dword;
Verursacher der ursprünglichen Fehlermeldung war wohl {$mode delphi}. Ich habe den Abschnitt über Operatoren in der FPC-Referenz gelesen, aber leider gab es da keine Hinweise auf unterschiedliche Reaktionen per Compilerschalter.
theo hat geschrieben:"Result" würde ich da nicht nehmen.
Ich habe nun eine neue Unit für die Operatoren erstellt. Nun bekomme ich andere Fehlermeldungen, denen das "result" wohl wirklich nicht gefällt.
Dabei war das Result aus den Operatordefinitionen der Unit Matrix abgekupfert.
Ubuntu 9.10 (L 0.9.28 FPC 2.4.x)

u-boot
Beiträge: 308
Registriert: Do 9. Apr 2009, 10:10
OS, Lazarus, FPC: Ubuntu 9.10 (L 0.9.28 FPC 2.2.4)
CPU-Target: 32Bit
Wohnort: 785..

Re: operator überladen

Beitrag von u-boot »

Mittlerweile bin ich bei

TGnurz = class
...

Code: Alles auswählen

operator:=(const a: dword) res: GNZTyp;
begin
  result:=TGnurz.WordToGNZTyp(a);
end;
gnurzoperators.pas(24,33) Error: Only class methods can be referred with class references
Ubuntu 9.10 (L 0.9.28 FPC 2.4.x)

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2822
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: operator überladen

Beitrag von m.fuchs »

Zwei Fehler:
  • Du definierst res und weist dann result. Das könnte vielleicht sogar klappen, wenn es bei Operatoren ähnlich wie bei Funktionen ist und eine magische Variable Result existiert.
  • Die Methode WordToGNZTyp ist keine Klassenmethode. Das heißt, sie kann nur über eine konkrete Instanz aufgerufen werden, nicht über den Klassenbezeichner selber. Entweder du erzeugst dir eine globale Variable vom Typ TGnurz und greifst auf dessen Methode zu (A) oder du machst WordToGNZTyp zu eine Klassenmethode (B).
    1. Code: Alles auswählen

      var
        BlaBlubb: TGnurz
       // ...
        operator:=(const a: dword) res: GNZTyp;
        begin
          res:=BlaBlubb.WordToGNZTyp(a);
        end;
        //...
        initialization
          BlaBlubb := TGnurz.Create;
        finalization
          FreeAndNil(BlaBlubb);
    2. Code: Alles auswählen

      type
        TGnurz = class
          //...
          public
            class function WordToGNZTyp(a: dword): GNZTyp;
        end;
        //...
Jeglicher Code frei aus dem Kopf und ohne Gewähr.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Socke
Lazarusforum e. V.
Beiträge: 3178
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: operator überladen

Beitrag von Socke »

m.fuchs hat geschrieben:
  • Du definierst res und weist dann result. Das könnte vielleicht sogar klappen, wenn es bei Operatoren ähnlich wie bei Funktionen ist und eine magische Variable Result existiert.
Free Pascal Language Reference Guide hat geschrieben:Remark: When compiling in Delphi mode or Objfpc mode, the result identifier may be dropped. The result can then be accessed through the standard Result symbol.
(http://www.freepascal.org/docs-html/ref/refse85.html)
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: operator überladen

Beitrag von pluto »

Müsste das nicht auch so gehen?

Code: Alles auswählen

operator:=(const a: dword) res: GNZTyp;
  begin
    res:=TGnurz.Create(..);
    res.WordToGNZTyp(a);
  end;
Dabei wird jedesmal eine neue Klassen-Instanz erzeugt.

edit01: Mist zu spät gesehen, dass die Typen nicht einheitlich sind, bei res und TGnurz... sonst müsste es so gehen.
MFG
Michael Springwald

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2822
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: operator überladen

Beitrag von m.fuchs »

Ok, dann reduziert sich das Problem nur auf den zweiten Fehler.
@u-boot: wenn du die generischen Rückgabevariable Result nutzt, solltest du in der Definitions vielleicht auf das res: verzichten. Sonst hast du irgendwann zuviel Verwirrung im Code.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Antworten